C# 异步/等待关键字在.net 4.0中不可用
我想在C#4.0中使用async/await,并安装了以下软件包: 问题是我没有可用的async/await关键字 我将VS2010与SP1一起使用C# 异步/等待关键字在.net 4.0中不可用,c#,async-await,C#,Async Await,我想在C#4.0中使用async/await,并安装了以下软件包: 问题是我没有可用的async/await关键字 我将VS2010与SP1一起使用 谢谢。Async/Await已随C#5.0和.netframework4.5引入 更多信息请点击此处: 如果您像我在企业中一样使用框架4,您可以使用其他解决方法。 您可以使用允许您使用这些功能的NuGet包 只需从NuGet package manager安装即可: 安装软件包Microsoft.Bcl.Async 摘自: 此软件包使Vis
谢谢。
Async/Await
已随C#5.0
和.netframework4.5
引入
更多信息请点击此处:
如果您像我在企业中一样使用框架4,您可以使用其他解决方法。
您可以使用允许您使用这些功能的NuGet包
只需从NuGet package manager安装即可:
安装软件包Microsoft.Bcl.Async
摘自:
此软件包使Visual Studio 2012项目能够使用新的“异步”和“等待”关键字。这个包还包括基于任务的扩展方法,这些方法允许将一些现有的异步API与新的语言关键字一起使用。Windows Phone Silverlight 8项目可以使用此包访问网络类型的异步扩展方法
你不会得到比这更好的答案 唯一受支持的方法是将VS2012与
Microsoft.Bcl.Async
一起使用
VS2010很难使用async
/wait
。有一个旧的异步CTP包(其中有许多从未修复过的错误)充当VS2010的“附加组件”/“部分替换”。然而,该软件包在VS2010更新中始终无法正常工作。因此,您必须首先找到一个旧CTP安装程序的版本,尝试安装一些VS更新,然后看看CTP是否有效。如果您已经安装了所有VS2010更新,那么CTP的任何版本都无法工作。我认为,一旦你发现了一个更新的情况,你可以安装一个工作的CTP,然后你可以安装其他的更新
在完成所有这些工作之后,您仍然会得到一个充满bug(而且肯定没有优化)的async
实现
或,您可以按照Jon Skeet的建议,下载免费版本的VS2012 Express和
Microsoft.Bcl.Async
,并拥有一个完全受支持的解决方案。我已经为.NET 4.0应用程序编写了一个使用Async
的.NET 4.5插件,令我惊讶的是,这确实有效
我认为这是可行的,因为我安装了.NET4.5,它用一个更新的运行时替换了.NET4运行时,该运行时同时用于.NET4.0和.NET4.5。然后,我的插件使用Assembly.Load(…)
或类似工具加载了反射。我尝试了async/await
和Environment.CurrentManagedThreadId
(一个.NET 4.5属性),两种方法都有效
因此,如果安装.NET 4.5是一个选项(即不支持Windows XP),则可以通过反射加载应用程序的.NET 4.5部分,可能让您的4.5部分实现4.0接口,从而使用混合。但是,如果您自己编写应用程序,那么一个更简单的解决方案是在整个项目中切换到.NET4.5
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;
}
更多信息:这些关键字在C#5.0中是新的。为什么要为此创建一个新问题?我已经解释了问题所在:VisualStudio需要在语言级别了解这一点。VS2010只支持C#4,不支持C#5。您需要安装旧的CTP(这在IMO中是个坏主意)或使用Visual Studio 2012或2013。虽然此帖子已被多次否决,但在第一个示例中,它确实显示了一种合理有效的等待任务完成的方式,特别是对于线程用户请求的.NET 4.0。