在.net 4上使用async-await


137

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

查看OS流行度图表,我需要再支持Windows XP三年左右。看起来.net 4.5仅在更新版本的Windows上运行,因此我需要定位.net 4.0。开发机器使用Windows 7,因此使用较新版本的VS没问题。

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

  • 带有AsyncCTP的VS2010
  • VS2012预览版(到达后即为最终版本),将目标设置为.net 4.0
  • Mono(看起来像2.12具有async-await,我更喜欢/ am习惯于使用VS取代MonoDevelop作为IDE)

哪一个代码错误较少?在Jon Skeet的博客中,VS2012 Preview使用的永远不会是CTP的代码生成器。

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

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

通过引用AsyncCTP运行时,我设法通过预览来编译代码。但是,由于CTP具有奇怪的许可条件,因此这似乎不是一个好的长期解决方案。

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

为了分发库,我更喜欢将dll与应用程序放在同一目录中,而不是某种安装程序。

如果我的二进制文件可以在mono + Linux / MacOS上运行而无需更改,我也很喜欢。因此,运行时应该与内置的mono(可能为2.12)兼容,或者允许在非Windows操作系统上使用。


1
我认为您不会对CTP版本感到满意,因为您将无法通过商业应用程序重新分发CTP中的任何内容。肯定存在漏洞,并且尚未针对性能进行优化。您也许会更快地开发它,但您的客户将不愿意安装可能会干扰最终发布版本的Beta版软件。
阿洛伊斯·克劳斯

@Alois更高版本的AsyncCTP允许重新分发。最糟糕的事情是我的应用程序中断了。并不是说它会干扰其他应用程序,所以我看不出您的音乐会会干扰最终版本。我的问题的一部分还在于,是否会首先有一个最终版本支持WinXP。
CodesInChaos 2012年

1
许可证明确声明(异步CTP 3)“ 1.a.ii。您同意在收到Microsoft的通知后立即停止这种使用;”。我怀疑此通知将在发布时来自MS。我不是律师,但我相信您的法律部门(如果有)会很乐意听取您的理据,说明您希望如何解决这一问题而又不会违反许可条款。
阿洛伊斯·克劳斯

Answers:


106

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为目标,则仍然可以使用(my)AsyncBridge for .NET 3.5


我找不到您的AsyncBridge许可证的任何参考资料吗?
2013年


15
请记住,在.NET 4.0上使用异步定位包需要安装KB2468871。
ghord

该KB2468871于2011年6月发布(6个月后V2发布),但它仍然可能没有安装,所以看看如何检查它在维克斯- stackoverflow.com/a/9506530/968003
亚历克斯·克劳斯

24

如果您愿意考虑使用其他.Net语言,则F#可以解决您的问题。它已经具有async {}计算表达式多年,并且甚至与.Net 2.0向后兼容。最低要求是Windows XP SP3。运行时可在此处下载。


4

可以使用VS 12 beta通过async / await将.NET 4.0作为目标。

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

详情在这里

编辑:我们已经采用了这项技术,并将其变成了一个名为AsyncBridge的开源库:https ://nuget.org/packages/AsyncBridge


3

如果您希望能够分发软件,我认为Mono解决方案确实是您目前唯一的选择。您还说过,您希望最终结果在Linux和OS X上的Mono上运行。首先将Mono作为目标似乎是自然的解决方案。

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

Greg Hurlman 创建了一个配置文件以针对Visual Studio中的Mono 2.8进行编码。如果您跟进他,他也许可以为您指出在Visual Studio中针对Mono 2.11 / 2.12开发的正确方向。

当然,还有用于商业目的Visual Studio的Mono工具。我认为Xamarin仍在提供它。

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

编辑:看来您现在可以在生产中使用Visual Studio异步CTP

这就是下载页面上的内容

包括供生产使用的新EULA。注意-此许可证并不鼓励您将CTP用于生产代码。CTP仍然不受支持,使用风险自负。但是,我们收到了许多开发人员的请求,要求将CTP用于生产代码,因此我们更改了许可证以允许这样做。


我在开发中使用的是次要问题。主要问题是我应该如何处理WinXP用户。您是否建议在我的应用程序中捆绑mono 2.12?
CodesInChaos

昨天,我研究了Mono的来源,并且至少有几个核心异步类(Async...Builder...Awaiter)很难与其余的Mono分开。目前,我正在研究重新实现AsyncCtpLibrary,可能会从mono中借用一些东西。
CodesInChaos

关于重新分发AsyncCtpLibrary,我知道原则上是可行的,但是对于一个许可证,其中包含一些奇怪的条款。但是我的主要问题是从长远来看会发生什么。如果不支持它,并且没有人修复其中的错误,那就很烦人了。
CodesInChaos 2012年

2

如果要在MS发布C#5.0之后开始分发软件,则可以开始使用AsycnCTP开发。否则,我不建议您使用它,因为它只是CTP,甚至不是beta。可以在Beta阶段和发行版附近进行很多更改。它可能不稳定,等等。

如果您想在应用程序中引入简单的异步操作,我建议您使用Reactive Extensions和构建在最上面的东西(Reactive UI等),它只是美丽而已。

至于VS2012,据我记得// MS / Build / tablet MS在该会议上给我提供的信息,它也包含相同的Async CTP。


1
我不在乎等待VS2012版本。我希望VS2012在我的软件脱离Alpha版本之前发布。但是,即使VS2012发布了,我也不想瞄准.net 4.5,因为WinXP上似乎不可用。所以,主要的问题是对.NET 4使用的异步运行
CodesInChaos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.