等待异步请求 webapi 2 客户端
Await in async request webapi 2 client
我试图了解等待 asp.net MVC web api 2 客户端(控制台应用程序)中的异步操作。我相信我做错了(由于缺乏对 await 和 async 的理解)。它似乎没有 运行 异步。这是理解问题的代码
//主要函数
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 ?尝试阅读博客和文章,但我不明白它是如何工作的。
您必须将 foreach 移出 RunAsync 方法。
要让 foreach 循环中的 RunAsync 在异步模式下工作,您必须创建多个任务,然后调用 Task.WaitAll
您可能正在寻找的语法是这样的:
public async Task<JArray> GetContentAsync(... updateObject)
{
HttpResponse response = await client.PostAsJsonAsync("webapimethod", updateObject);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsAsync<JArray>();
}
}
由于 await
关键字,GetContentAsync()
方法中的线程将在 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>
我试图了解等待 asp.net MVC web api 2 客户端(控制台应用程序)中的异步操作。我相信我做错了(由于缺乏对 await 和 async 的理解)。它似乎没有 运行 异步。这是理解问题的代码
//主要函数
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 ?尝试阅读博客和文章,但我不明白它是如何工作的。
您必须将 foreach 移出 RunAsync 方法。 要让 foreach 循环中的 RunAsync 在异步模式下工作,您必须创建多个任务,然后调用 Task.WaitAll
您可能正在寻找的语法是这样的:
public async Task<JArray> GetContentAsync(... updateObject)
{
HttpResponse response = await client.PostAsJsonAsync("webapimethod", updateObject);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsAsync<JArray>();
}
}
由于 await
关键字,GetContentAsync()
方法中的线程将在 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>