等待异步请求webapi 2客户端

时间:2016-02-18 09:39:05

标签: c# asp.net-web-api async-await asp.net-web-api2 dotnet-httpclient

我试图了解等待asp.net MVC web api 2客户端(控制台应用程序)中的异步操作。我相信我做错了(由于缺乏理解等待和异步)。它似乎没有运行异步。这是解释问题的代码

//主要功能

static void Main()
{
    RunAsync().Wait();

}

// RunAsync

static async Task RunAsync()
{
    using (var client = new HttpClient())
    {
        var apiUrl = ConfigurationManager.AppSettings["apiurl"];
        client.BaseAddress = new Uri(apiUrl);

        ....some code to fetch data

        foreach (var updateObject in updatedata)
        {
            HttpResponse  response = await client.PostAsJsonAsync("webapimethod", updateObject);
            if (response.IsSuccessStatusCode)
            {
                JArray content = await response.Content.ReadAsAsync<JArray>();
            }
        }
    }
}

在上面的代码中,foreach循环我在循环中请求PostAsJsonAsync调用,然后我使用ReadAsAsync来获取响应,但请求始终运行同步。不喜欢被解雇,然后当响应到达时读取数据。

它工作正常,但我希望它是异步的,而不是等待每个请求。如何实现这一点或请在此上下文中解释等待异步?试图阅读博客和文章,但我不知道它将如何运作。

2 个答案:

答案 0 :(得分:3)

您可能正在寻找的语法是:

public async Task<JArray> GetContentAsync(... updateObject)
{
  HttpResponse  response = await client.PostAsJsonAsync("webapimethod", updateObject);
  if (response.IsSuccessStatusCode)
  {
      return await response.Content.ReadAsAsync<JArray>();
  }
}

由于GetContentAsync()关键字发生client.PostAsJsonAsyncawait方法中的帖子将被放回到线程池中。

然后,您可以在方法中创建调用它的所有任务:

var updateData = fetchData();
var tasks = updateData.Select(d => GetContentAsync(d));
var result = (await Task.WhenAll(tasks)).ToList();

Select将为您的每个结果创建一个任务。 await Task.WhenAll将解包Task<JArray>并创建List<JArray>

答案 1 :(得分:1)

您必须将Foreach移出RunAsync方法。 要使foreach循环中的RunAsync在异步模式下工作,您必须创建多个任务,然后调用Task.WaitAll