在 .net 4 上使用 async-await

Posted

技术标签:

【中文标题】在 .net 4 上使用 async-await【英文标题】:Using async-await on .net 4 【发布时间】:2012-02-24 23:56:55 【问题描述】:

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

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

现在我需要先选择一个编译器:

带有 AsyncCTP 的 VS2010 VS2012 预览版(最终到达后),将目标设置为 .net 4.0 Mono(看起来 2.12 有 async-await,我更喜欢/习惯 VS 而不是 MonoDevelop 作为 IDE)

哪一个的代码生成错误更少?看看Jon Skeet's blog,VS2012 Preview 使用的代码生成器永远比 CTP 好。

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

VS2012 是否包含用于 .net 4 的可再发行异步运行时?

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

或者我应该使用第三方实现吗?也许 mono 有一个?

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

如果我的二进制文件在 mono+Linux/MacOS 上无需更改也能正常工作,我也很高兴。所以运行时应该与任何内置的单声道(可能是 2.12)兼容,或者允许在非 Windows 操作系统上使用。

【问题讨论】:

我认为 CTP 版本不会让您走得太远,因为您将不被允许使用商业应用程序重新分发 CTP 中的任何内容。肯定有漏洞潜伏着,而且还没有针对性能进行优化。您可能会更快地开发它,但您的客户不会乐于安装可能会干扰最终发布版本的测试版软件。 @Alois 更高版本的 AsyncCTP 允许重新分发。可能发生的最糟糕的事情是我的应用程序中断。它不像它可以干扰其他应用程序,所以我不明白你的音乐会对最终版本的干扰。我的另一个问题是,是否会有一个最终版本首先支持 WinXP。 许可证明确声明 (Async CTP 3) “1.a.ii. 您同意在收到 Microsoft 通知后立即停止此类使用;”。我怀疑这个通知在发布时会来自 MS。我不是律师,但我相信您的法律部门(如果有的话)很想听听您的理由,您希望如何在不违反许可条款的情况下解决这个问题。 【参考方案1】:

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

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

至于 VS2012,据我记忆,它还包含相同的异步 CTP,这是我的 //Build/ 平板电脑 MS 在那次会议上给我的。

【讨论】:

我不在乎等待VS2012发布。我希望 VS2012 在我的软件没有 alpha 版本之前发布。但即使 VS2012 发布,我也不想针对 .net 4.5,因为 WinXP 上似乎没有。所以主要问题是在 .net 4 上使用哪个异步运行时。【参考方案2】:

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

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

Greg Hurlman created a profile 从 Visual Studio 针对 Mono 2.8 进行编码。如果您跟进他,他可能会为您指出在 Visual Studio 中针对 Mono 2.11/2.12 进行开发的正确方向。

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

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

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

这是download page上的内容:

包括用于生产用途的新 EULA。注意 - 此许可证不 鼓励您使用 CTP 进行制作 代码。 CTP 仍然不受支持且使用风险自负 技术预览。但是,我们收到了很多来自 开发人员将 CTP 用于生产代码,因此更改了 许可。

【讨论】:

我在开发中使用的是次要问题。主要问题是我应该交给我的 WinXP 用户什么。您是否建议将 mono 2.12 与我的应用程序捆绑在一起? 昨天我查看了单声道源,至少有几个核心异步类(Async...Builder...Awaiter)很难与单声道的其余部分分开。目前我正在考虑重新实现AsyncCtpLibrary,可能会从单声道中借用一点。 在重新分发AsyncCtpLibrary 时,我知道原则上这是可能的,但其中一个许可证包含一些奇怪的条款。但我的主要问题是从长远来看会发生什么。如果它变得不受支持,并且没有人修复其中的错误,那可能会很烦人。【参考方案3】:

如果您愿意考虑其他 .Net 语言,F# 可以解决您的问题。它多年来一直使用 async 计算表达式,并且即使与 .Net 2.0 也向后兼容。最低要求是 Windows XP SP3。运行时可以下载here。

【讨论】:

【参考方案4】:

可以使用 VS 12 beta 来使用 async/await 来定位 .NET 4.0。

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

详情here

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

【讨论】:

【参考方案5】:

Microsoft 发布了 Async Targeting Pack (Microsoft.Bcl.Async) 到 Nuget 作为 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 + async 的最佳选择是使用 Visual Studio 2012 + C#5 + Async Targeting Pack。

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

【讨论】:

我找不到您的 AsyncBridge 许可证的任何参考资料? 查看这里:github.com/OmerMor/AsyncBridge/blob/master/src/AsyncBridge/… 请记住,在 .NET 4.0 上使用异步目标包需要安装 KB2468871。 KB2468871 于 2011 年 6 月发布(6 个月后 v2 发布),但仍可能无法安装,请查看如何在 WiX 中查看 - ***.com/a/9506530/968003。

以上是关于在 .net 4 上使用 async-await的主要内容,如果未能解决你的问题,请参考以下文章

在 .net 4 上使用 async-await

如何使用 Mono 在 XSP 上运行 .NET 4.5?

.NET 4.5 应用程序在具有 .NET 4.0 的系统上的特定功能兼容性

在 Windows 8 的 IIS 8 上使用 .NET 4.5 的 MVC 4 网站给出 403.14 禁止错误 [关闭]

如何在使用 asp.net 4.0 创建的网站上上传超过 2 MB 的内容 [重复]

ASP.NET 4.0尚未在 Web 服务器上注册 解决方法