ChatGPT解决这个技术问题 Extra ChatGPT

在 .net 4 上使用 async-await

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

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

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

VS2010 带 AsyncCTP

VS2012 预览版(以及最终版),将目标设置为 .net 4.0

Mono(看起来 2.12 有 async-await,我更喜欢/习惯于 VS 而不是 MonoDevelop 作为 IDE)

哪一个的代码生成错误更少?查看 Jon Skeet's blog,VS2012 预览版使用的代码生成器从不使用 CTP。

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

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

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

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

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

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

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

O
Omer Mor

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


我找不到您的 AsyncBridge 许可证的任何参考?
请记住,在 .NET 4.0 上使用异步目标包需要安装 KB2468871。
KB2468871 于 2011 年 6 月发布(并在 6 个月后发布了 v2),但可能仍未安装,因此请查看如何在 WiX - stackoverflow.com/a/9506530/968003 中检查它。
M
Marc Sigrist

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


S
Svante Svenson

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

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

详情here

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


J
Justin

如果您希望能够分发您的软件,我认为 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 时,我知道原则上是可能的,但其中一个许可证包含一些奇怪的条款。但我的主要问题是从长远来看会发生什么。如果它变得不受支持,并且没有人修复其中的错误,那可能会很烦人。
A
Alexey Raga

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

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

至于 VS2012,据我记得,它还包含与我在//Build/tablet MS 在那次会议上给我的相同的异步 CTP。


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