【问题标题】:async/await keywords not available in .net 4.0async/await 关键字在 .net 4.0 中不可用
【发布时间】:2013-10-17 09:44:35
【问题描述】:

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

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

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

我正在使用带有 SP1 的 VS2010。

谢谢。

【问题讨论】:

  • 这些关键字是 C# 5.0 中的新关键字。
  • 你为什么要为此创建一个新问题?我已经解释了问题所在:Visual Studio 需要在语言级别上了解这一点。 VS2010 仅支持 C# 4,不支持 C# 5。要么您需要安装旧的 CTP(IMO 是个坏主意),要么使用 Visual Studio 2012 或 2013。

标签: c# async-await


【解决方案1】:

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

唯一受支持的方法是使用 VS2012 和 Microsoft.Bcl.Async。

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

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

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

【讨论】:

    【解决方案2】:

    Async/Await 已与C# 5.0 和.NET Framework 4.5 一起引入

    更多信息在这里:

    Asynchronous Programming with Async and Await (C# and Visual Basic)

    Asynchronous Programming in C# 5.0 using async and await

    如果您像我在企业中那样使用 Framework 4,则可以使用其他解决方法。 您可以使用允许您使用这些功能的 NuGet 包。

    Using async/await without .NET Framework 4.5

    只需从 NuGet 包管理器安装它:

    安装包 Microsoft.Bcl.Async

    摘自NuGet Gallery:

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

    【讨论】:

      【解决方案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/

      【讨论】:

      • 虽然这篇文章多次被否决,但它确实显示了在第一个示例中等待任务完成的合理有效的方式,尤其是对于线程用户要求的 .NET 4.0。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-28
        • 1970-01-01
        • 2012-11-28
        • 2015-10-26
        • 2012-06-29
        • 1970-01-01
        • 2015-05-04
        • 2018-10-02
        相关资源
        最近更新 更多