C# 异步/等待关键字在.net 4.0中不可用

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

我想在C#4.0中使用async/await,并安装了以下软件包:

问题是我没有可用的async/await关键字

我将VS2010与SP1一起使用


谢谢。

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。