在异步请求 webapi 2 客户端中等待

本文关键字:客户端 等待 webapi 异步 请求 | 更新日期: 2023-09-27 18:35:07

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

主函数

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

/运行异步

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 来获取响应,但请求始终运行同步。 不像被解雇,然后当响应到达时读取数据。

它工作正常,但我希望它是异步的,而不是等待每个请求。如何实现这一目标或请在这种情况下解释 await async?尝试阅读博客和文章,但我不明白它将如何工作。

在异步请求 webapi 2 客户端中等待

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

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

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

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

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>

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