我想在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的回答更好的解决方案。
唯一支持的方法是使用带有Microsoft.Bcl.Async
的VS2012。
使用async
/await
在VS2010中非常困难。曾经有一个旧版的Async CTP软件包(其中存在许多永远无法修复的错误),它充当了VS2010的“附加组件”/“部分替代品”。但是,该软件包无法很好地与VS2010更新兼容。因此,您必须首先找到一种旧版CTP安装程序的版本,尝试安装某些VS更新,并查看CTP是否有效。如果您已经安装了所有VS2010更新,则任何版本的CTP都无法工作。我认为,一旦您找到一种可以安装工作CTP的更新情况,那么您就可以安装其他更新。
完成所有这些工作后,您仍将得到一个充满错误(并且肯定未经优化)的async
实现。
或者,您可以像Jon Skeet建议的那样,下载带有Microsoft.Bcl.Async
的免费版本的VS2012 Express,从而拥有一个完全支持的解决方案。
Async/Await
是在C# 5.0
和.NET Framework 4.5
中引入的。您可以在这里获取更多信息:使用 Async 和 Await 进行异步编程 (C# 和 Visual Basic),或者使用 async 和 await 进行 C# 5.0 中的异步编程。从NuGet Gallery中提取的内容如下:Install-Package Microsoft.Bcl.Async
此软件包使得 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;
}
我使用async
编写了一个.NET 4.5插件,用于.NET 4.0应用程序,令我惊讶的是它竟然可以工作!
我认为这能够工作是因为我已经安装了.NET 4.5,它用更新后的.NET 4运行时替换了.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。