Using async-await on .net 4

2018-12-31 20:21发布

问题:

I\'m currently starting to create an application that would profit a lot from C# 5\'s async-await feature. But I\'m not sure which version of VS and of the async runtime to use.

Looking at OS popularity charts, I\'ll need to support Windows XP for another three years or so. It looks like .net 4.5 runs only on newer versions of Windows, so I need to target .net 4.0. The development machines use Windows 7, so using a newer version of VS is not a problem.

Now I need to first choose a compiler for doing this:

  • VS2010 with AsyncCTP
  • VS2012 Preview (and final once it arrives), setting the target to .net 4.0
  • Mono (Looks like 2.12 has async-await, I prefer/am used to VS over MonoDevelop as IDE)

Which one has fewer code-gen bugs? Looking at Jon Skeet\'s blog the VS2012 Preview uses a never code-generator than the CTP.

And more importantly which runtime to use?

Does VS2012 contain a redistributable async runtime for use with .net 4?

I managed to compile code, with the preview, by referencing the AsyncCTP runtime. But since the CTP has strange licensing conditions, that doesn\'t look like a good long term solution.

Or should I use a third party implementation? Perhaps mono has one?

For distributing the library I prefer simply putting the dll in the same directory as the application, instead of some kind of installer.

I\'d also like it if my binaries would work without changes on mono+Linux/MacOS. So the runtime should either be compatible with whatever mono (2.12 probably) has built in, or allow use on non windows OSs.

回答1:

Microsoft released the Async Targeting Pack (Microsoft.Bcl.Async) through Nuget as a replacement for the AsyncCTP.

You can read more about it here: http://blogs.msdn.com/b/bclteam/archive/2013/04/17/microsoft-bcl-async-is-now-stable.aspx.

You can read about the previous version here: http://blogs.msdn.com/b/lucian/archive/2012/04/24/async-targeting-pack.aspx.

As this pack is officially supported, I now believe the best option for targeting XP + async would be using Visual Studio 2012 + C#5 + Async Targeting Pack.

If you feel the need to target .NET 3.5 though, you can still use (my) AsyncBridge for .NET 3.5.



回答2:

If you are open to considering other .Net languages, F# can solve your problem. It has had the async{} computation expression for years, and is backwards compatible even with .Net 2.0. Minimum requirement is Windows XP SP3. The runtime can be downloaded here.



回答3:

If you want to be able to distribute your software, I think that the Mono solution is really your only option right now. You also say that you want the end result to run on Mono over Linux and OS X. Targeting Mono to begin with seems like the natural solution.

Your next issue is the IDE. MonoDevelop would obviously work well but you say you prefer Visual Studio.

Greg Hurlman created a profile to code against Mono 2.8 from Visual Studio. If you follow-up with him, he might be able to point you in the right direction for developing against Mono 2.11/2.12 in Visual Studio.

Of course, there is also Mono Tools for Visual Studio which is a commercial product. I assume that it is still being offered by Xamarin.

You might also be able to run the required 4.5 profile assemblies from Mono on top of .NET but I have not tried that. The 4.5 profile is a strict super-set of the 4.0 API. Perhaps give it a shot and report back.

EDIT: It looks like perhaps you can use the Visual Studio Async CTP in production now

Here is what it says on the download page:

Includes a new EULA for production use. Note - This license does not constitute encouragement for you to use the CTP for your production code. The CTP remains an unsupported and use-at-your-own-risk Technology Preview. However, we’ve received many requests from developers to use the CTP for production code, and so have changed the license to allow that.



回答4:

It\'s possible to use the VS 12 beta to target .NET 4.0 using async/await.

You need to copy some code into your project that provides the types that the compiler relies on.

Details here

Edit: we\'ve taken this technique and turned it into a open source library called AsyncBridge: https://nuget.org/packages/AsyncBridge



回答5:

If you want to start distributing your software after MS releases C# 5.0, then you can start developing using AsycnCTP. Otherwise I wouldn\'t recommend you to use it, as it is just CTP, not even a beta. It can be changed a lot close to the beta stage and to the release. It may be unstable, etc.

If you want to introduce easy async operations in your application I would recommend you to use Reactive Extensions and stuff built on top (Reactive UI, etc), it is just beautiul.

As for VS2012, it also contains the same Async CTP as far as I remember from my //Build/ tablet MS gave me on that conference.