在.net 4上使用异步等待

本文关键字:异步 等待 net | 更新日期: 2023-09-27 18:22:08

我目前正在开始创建一个应用程序,该应用程序将从C#5的异步等待功能中受益匪浅。但我不确定使用哪种版本的VS和异步运行时。

从操作系统流行度图表来看,我需要再支持Windows XP三年左右。看起来.net 4.5只在更新版本的Windows上运行,所以我需要以.net 4.0为目标。开发机器使用Windows7,因此使用较新版本的VS不是问题。

现在我需要首先选择一个编译器来执行此操作:

  • 带有AsyncCTP的VS2010
  • VS2012预览版(最终版),将目标设置为.net 4.0
  • Mono(看起来2.12有异步等待,我更喜欢/习惯于VS而不是作为IDE的MonoDevelop)

哪一个的代码生成错误更少?在Jon Skeet的博客中,VS2012预览版使用了一个从未像CTP那样的代码生成器。

更重要的是使用哪个运行时

VS2012是否包含可与.net 4一起使用的可重新分发异步运行时?

我通过引用AsyncCTP运行时,成功地编译了带有预览的代码。但由于CTP有奇怪的许可条件,这看起来不是一个好的长期解决方案。

还是应该使用第三方实现?也许mono有一个?

对于分发库,我更喜欢简单地将dll放在与应用程序相同的目录中,而不是某种安装程序。

如果我的二进制文件在mono+Linux/MacOS上不做任何更改,我也会很高兴。因此,运行时应该与mono(可能是2.12)内置的内容兼容,或者允许在非windows操作系统上使用。

在.net 4上使用异步等待

Microsoft通过Nuget发布了Async Targeting Pack(Microsoft.Bcl.Async),作为AsyncCTP的替代品。

您可以在此处阅读更多信息:http://blogs.msdn.com/b/bclteam/archive/2013/04/17/microsoft-bcl-async-is-now-stable.aspx.

您可以在此处阅读有关早期版本的信息:http://blogs.msdn.com/b/lucian/archive/2012/04/24/async-targeting-pack.aspx.

由于此软件包得到了官方支持,我现在认为针对XP+异步的最佳选择是使用Visual Studio 2012+C#5+异步目标软件包。

不过,如果您觉得需要以.NET 3.5为目标,您仍然可以使用(我的)AsyncBridge for.NET 3.5。

如果您愿意考虑其他.Net语言,F#可以解决您的问题。多年来,它一直使用异步{}计算表达式,甚至与.Net 2.0向后兼容。最低要求是Windows XP SP3。运行时可以在这里下载。

使用async/await可以使用VS 12测试版来瞄准.NET 4.0。

您需要将一些代码复制到您的项目中,以提供编译器所依赖的类型。

此处为详细信息

编辑:我们采用了这种技术,并将其转化为一个名为AsyncBridge的开源库:https://nuget.org/packages/AsyncBridge

如果你想分发你的软件,我认为Mono解决方案实际上是你现在唯一的选择。你还说,你希望最终结果在Linux和OS X上的Mono上运行。从一开始就瞄准Mono似乎是一个自然的解决方案。

您的下一个问题是IDE。MonoDevelop显然工作得很好,但你说你更喜欢Visual Studio。

Greg Hurlman创建了一个针对Visual Studio中Mono 2.8的配置文件。如果你和他一起跟进,他可能会为你在Visual Studio中针对Mono 2.11/21.12进行开发指明正确的方向。

当然,还有Mono Tools for Visual Studio,它是一种商业产品。我认为Xamarin仍在提供。

您还可以在.NET之上从Mono运行所需的4.5配置文件程序集,但我还没有尝试过。4.5配置文件是API 4.0的一个严格的超级集。也许给它一个机会,并报告回来。

EDIT:看起来您现在可以在生产中使用Visual Studio Async CTP

以下是下载页面上的内容:

包括用于生产的新EULA。注意-此许可证不鼓励您在生产中使用CTP密码CTP仍然不受支持,使用风险自负技术预览。然而,我们收到了许多来自开发人员将CTP用于生产代码,因此更改了许可证允许这样做。

如果您想在MS发布C#5.0之后开始分发软件,那么您可以开始使用AsycnCTP进行开发。否则,我不建议您使用它,因为它只是CTP,甚至不是测试版。它可以在接近测试阶段和发布时进行大量更改。它可能不稳定等。

如果你想在你的应用程序中引入简单的异步操作,我建议你使用Reactive Extensions和构建在上面的东西(Reactive UI等),这很好。

至于VS2012,据我记忆所及,它还包含了MS在那次会议上给我的//构建/平板电脑中的相同异步CTP。