25

我想在 C# 4.0 中使用 async/await 并且我已经安装了以下包:

http://www.nuget.org/packages/Microsoft.Bcl.Async/

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

我正在使用带有 SP1 的 VS2010。

谢谢。

4

4 回答 4

31

你不会得到比Jon Skeet更好的答案。

唯一受支持的方法是将VS2012Microsoft.Bcl.Async.

VS2010 很难使用async/ await。有一个旧的 Async CTP 包(其中有许多从未修复的错误)充当 VS2010 的“附加”/“部分替换”。但是,该软件包从未与 VS2010 更新很好地配合使用。因此,您必须首先找到一个旧 CTP 安装程序的版本,尝试安装一些VS 更新,然后查看 CTP 是否有效。如果您已经安装了所有的 VS2010 更新,那么没有任何版本的 CTP 可以工作。我认为一旦您找到可以安装工作 CTP 的更新情况,您就可以安装其他更新。

在完成所有这些工作之后,您仍然会得到一个充满错误(而且绝对未优化)的async.

或者,您可以按照 Jon Skeet 的建议下载 VS2012 Express 的免费版本,Microsoft.Bcl.Async并获得完全支持的解决方案。

于 2013-10-17T12:33:21.250 回答
20

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 项目可以使用这个包来访问网络类型的异步扩展方法。

于 2013-10-17T10:55:01.277 回答
3
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/

于 2019-07-04T16:45:31.320 回答
0

我已经async为 .NET 4.0 应用程序编写了一个 .NET 4.5 插件,令我惊讶的是,这确实有效!

我认为这很有效,因为我安装了 .NET 4.5,它用更新的运行时替换了 .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。

于 2014-11-19T10:05:23.093 回答