在.net 4.0中,async/await关键字不可用。

27

2
这些关键字是C# 5.0中的新内容。 - Steven
11
你为什么要创建一个新问题?我已经解释了问题所在:Visual Studio需要在语言层面上了解这个问题。VS2010只支持C# 4,不支持C# 5。你需要安装旧版CTP(我认为这是个糟糕的主意),或者使用Visual Studio 2012或2013。 - Jon Skeet
4个回答

31

你不可能得到比Jon Skeet的回答更好的解决方案。

唯一支持的方法是使用带有Microsoft.Bcl.AsyncVS2012

使用async/await在VS2010中非常困难。曾经有一个旧版的Async CTP软件包(其中存在许多永远无法修复的错误),它充当了VS2010的“附加组件”/“部分替代品”。但是,该软件包无法很好地与VS2010更新兼容。因此,您必须首先找到一种旧版CTP安装程序的版本,尝试安装某些VS更新,并查看CTP是否有效。如果您已经安装了所有VS2010更新,则任何版本的CTP都无法工作。我认为,一旦您找到一种可以安装工作CTP的更新情况,那么您就可以安装其他更新。

完成所有这些工作后,您仍将得到一个充满错误(并且肯定未经优化)的async实现。

或者,您可以像Jon Skeet建议的那样,下载带有Microsoft.Bcl.Async的免费版本的VS2012 Express,从而拥有一个完全支持的解决方案。


20
Async/Await是在C# 5.0.NET Framework 4.5中引入的。您可以在这里获取更多信息:使用 Async 和 Await 进行异步编程 (C# 和 Visual Basic),或者使用 async 和 await 进行 C# 5.0 中的异步编程
如果您像我一样在企业中使用Framework 4,则可以使用其他解决方法。您可以使用一个 NuGet 包来使用这些功能。不使用 .NET Framework 4.5 使用 async/await
只需通过 NuGet 包管理器安装它:

Install-Package Microsoft.Bcl.Async

NuGet Gallery中提取的内容如下:

此软件包使得 Visual Studio 2012 项目能够使用新的“async”和“await”关键字。此软件包还包括任务扩展方法,允许使用一些现有的异步 API 与新的语言关键字。Windows Phone Silverlight 8 项目可以使用此软件包来访问用于网络类型的异步扩展方法。


4
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/

2
尽管这篇帖子已经被多次投票降低了评分,但它确实展示了一种相当有效的等待任务完成的方法,特别是对于线程用户所要求的.NET 4.0。 - Ben O

0

我使用async编写了一个.NET 4.5插件,用于.NET 4.0应用程序,令我惊讶的是它竟然可以工作!

我认为这能够工作是因为我已经安装了.NET 4.5,它用更新后的.NET 4运行时替换了.NET 4运行时,这个更新后的运行时同时适用于.NET 4.0和.NET 4.5。然后我的插件通过反射使用Assembly.Load(...)或类似方法进行加载。我尝试了async/awaitEnvironment.CurrentManagedThreadId(一个.NET 4.5属性),两者都可以工作。

因此,如果安装.NET 4.5是一个选项(即不支持Windows XP),则可以通过反射加载应用程序的.NET 4.5部分,可能让你的4.5部分实现一个4.0接口来混合使用。但是,如果你自己编写应用程序,那么一个更简单的解决方案就是将整个项目切换到.NET 4.5。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接