我想在 C# 4.0 中使用 async/await 并且我已经安装了以下包:
http://www.nuget.org/packages/Microsoft.Bcl.Async/
问题是我没有可用的 async/await 关键字。
我正在使用带有 SP1 的 VS2010。
谢谢。
我想在 C# 4.0 中使用 async/await 并且我已经安装了以下包:
http://www.nuget.org/packages/Microsoft.Bcl.Async/
问题是我没有可用的 async/await 关键字。
我正在使用带有 SP1 的 VS2010。
谢谢。
你不会得到比Jon Skeet更好的答案。
唯一受支持的方法是将VS2012与Microsoft.Bcl.Async
.
VS2010 很难使用async
/ await
。有一个旧的 Async CTP 包(其中有许多从未修复的错误)充当 VS2010 的“附加”/“部分替换”。但是,该软件包从未与 VS2010 更新很好地配合使用。因此,您必须首先找到一个旧 CTP 安装程序的版本,尝试安装一些VS 更新,然后查看 CTP 是否有效。如果您已经安装了所有的 VS2010 更新,那么没有任何版本的 CTP 可以工作。我认为一旦您找到可以安装工作 CTP 的更新情况,您就可以安装其他更新。
在完成所有这些工作之后,您仍然会得到一个充满错误(而且绝对未优化)的async
.
或者,您可以按照 Jon Skeet 的建议下载 VS2012 Express 的免费版本,Microsoft.Bcl.Async
并获得完全支持的解决方案。
Async/Await
已经介绍了C# 5.0
和.NET Framework 4.5
更多信息在这里:
使用 Async 和 Await 进行异步编程(C# 和 Visual Basic)
在 C# 5.0 中使用 async 和 await 进行异步编程
如果您像我在企业中那样使用Framework 4 ,则可以使用其他解决方法。您可以使用允许您使用这些功能的 NuGet 包。
在没有 .NET Framework 4.5 的情况下使用 async/await
只需从 NuGet 包管理器安装它:
安装包 Microsoft.Bcl.Async
从NuGet 库中提取:
此包使 Visual Studio 2012 项目能够使用新的“async”和“await”关键字。这个包还包括基于任务的扩展方法,允许使用一些现有的异步 API 和新的语言关键字。Windows Phone Silverlight 8 项目可以使用这个包来访问网络类型的异步扩展方法。
using System.Threading.Tasks;
private void simpleMethod()
{
var tsk = Task.Factory.StartNew(() => DoSomeWorkAsync());
Task.WaitAll(tsk);
DataTable table = tsk.Result;
}
异步方法不应包含任何影响表单控件的方法,这一点很重要
private DataTable DoSomeWorkAsync()
{
System.Data.DataTable table = new System.Data.DataTable();
Thread.Sleep(4000); // Any long time process
return table;
}
更多信息:https ://www.simplethread.com/net-40-and-systemthreadingtasks/
我已经async
为 .NET 4.0 应用程序编写了一个 .NET 4.5 插件,令我惊讶的是,这确实有效!
我认为这很有效,因为我安装了 .NET 4.5,它用更新的运行时替换了 .NET 4 运行时,它同时用于 .NET 4.0 和 .NET 4.5。然后我的插件加载了反射使用Assembly.Load(...)
或类似的。我尝试了两者async/await
和Environment.CurrentManagedThreadId
(.NET 4.5 属性),并且都有效。
因此,如果安装 .NET 4.5 是一种选择(即不支持 Windows XP),则可以通过反射加载应用程序的 .NET 4.5 部分来混合使用,可能让您的 4.5 部分实现 4.0 接口。但是,如果您自己编写应用程序,那么更简单的解决方案是为整个项目切换到 .NET 4.5。