首页 > 解决方案 > 在 C# 的 Action 中调用异步代码

问题描述

我正在从一些 C# 代码调用 Web 服务。此代码类似于:

using (var client = new HttpClient())
{
  var page = "http://en.wikipedia.org/";
  using (var response = await client.GetAsync(page))
  {
    using (var content = response.Content)
    {
      var result = await content.ReadAsStringAsync();
    }
  }
}

我想在实用程序方法中执行此代码。据我了解,Action委托适合此操作。我尝试使用以下方法来做到这一点:

Action action = delegate()
{
  using (var client = new HttpClient())
  {
    var page = "http://en.wikipedia.org/";
    using (var response = await client.GetAsync(page))
    {
      using (var content = response.Content)
      {
        var result = await content.ReadAsStringAsync();
      }
    }
  }
}

当我将 Web 服务代码包装在Action委托中时,我收到一个编译时错误,上面写着:

The 'await' operator can only be used within an async anonymous method. Consider marking this anonymous method with the 'async' modifier.

我的问题是,如何在 Action 中调用异步代码?看来我做不到。如果我不能,是否有另一种方法可以将代码块传递给实用程序方法以执行?那看起来像什么?

谢谢!

标签: c#async-await

解决方案


您需要async像标记任何方法一样标记您的操作,例如:

Action action = async delegate() 
    //snip

但是,这相当于async void不推荐的方法。相反,你们许多人考虑使用Func<Task>而不是行动:

Func<Task> doStuff = async delegate()
{
  using (var client = new HttpClient())
  {
    var page = "http://en.wikipedia.org/";
    using (var response = await client.GetAsync(page))
    {
      using (var content = response.Content)
      {
        var result = await content.ReadAsStringAsync();
      }
    }
  }
}

现在您可以等待结果:

await doStuff();

推荐阅读