【发布时间】:2016-02-18 09:39:05
【问题描述】:
我试图了解在 asp.net MVC web api 2 客户端(控制台应用程序)中等待异步操作。我相信我做错了(由于缺乏对等待和异步的理解)。它似乎没有异步运行。这是理解问题的代码
//主函数
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 来获取响应,但请求始终运行同步。不像被解雇,然后在响应到达时读取数据。
它工作正常,但我希望它是异步的,而不是等待每个请求。如何实现这一点,或者请在这种情况下解释等待异步?尝试阅读博客和文章,但我不明白它是如何工作的。
【问题讨论】:
-
Wait()使您阻塞线程,直到异步方法完成执行,从而使其同步。请改用await RunAsync() -
好的,我明白了,但是 foreach 循环怎么样?
-
从您的问题看来,您更想并行运行 foreach 吗?在第一个等待
PostAsJsonAsync等时启动第二个? -
@SSA 这里是关于 foreach 循环中异步的问题:stackoverflow.com/questions/19431494/how-to-use-await-in-a-loop
-
@AlexanderDerck
Wait()在控制台应用程序的 Main 方法中。这是您想要阻止异步调用的非常少数情况之一,否则程序将立即终止。我认为对于这样的应用程序来说,这实际上是一个很好的结构 - 将程序的核心放在异步方法中,除了调用它并在 Main 中阻塞之外什么都不做。
标签: c# asp.net-web-api async-await asp.net-web-api2 dotnet-httpclient