其他分享
首页 > 其他分享> > 异步请求Webapi 2客户端中等待

异步请求Webapi 2客户端中等待

作者:互联网

我试图了解在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取回响应,但请求始终运行同步.不喜欢被解雇,然后在响应到达时读取数据.

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

解决方法:

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

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

在这里,由于await关键字,当client.PostAsJsonAsync发生时,来自GetContentAsync()方法的线程将放回线程池中.

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

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

Select将为您的每个结果创建一个任务.
等待任务.WhenAll将解开Task< JArray>.并创建一个List< JArray>

标签:asp-net-web-api,asp-net-web-api2,async-await,dotnet-httpclient,c
来源: https://codeday.me/bug/20191027/1943646.html