在下面的示例中,我有一个带有标志异步调用的方法。
在该方法中,它将异步进行两个单独的网络调用,并在两个都被调用并且需要结果之后等待它们。一旦获得了两者的结果,它将调用一种方法,一次处理两个网络调用的结果。每个项目都需要一个网络调用,出于这个问题的目的,该网络调用不能设为异步,必须立即等待。
private HttpClient client = new HttpClient();
static async Task Main()
{
var task1 = FooAsync(true);
var task2 = FooAsync(false);
Task.WaitAll(Task1, Task2);
// Do some stuff with the results
}
private async Task<List<int>> FooAsync(bool input)
{
HttpResponseMessage response1 = client.GetAsync("https://baseUrlX/" + input.ToString());
HttpResponseMessage response2 = client.GetAsync("https://baseUrlY/" + input.ToString());
string content1 = await response1.Content.ReadAsStringAsync();
string content2 = await response2.Content.ReadAsStringAsync();
return ProcessItems(content1, content2);
}
private async Task<List<int>> ProcessItemsAsync(string content1, string content2)
{
List<int> results = new List<int>();
string content = content1 + content2;
foreach(char c in content)
{
var response = client.GetAsync("https://someUrl/" + c);
string content = await response.Content.ReadAsStringAsync(); // Blocking call here
results.Add(Int.Parse(content));
}
return results;
}
我的问题是Main()
中的两个异步调用是否完成了任何事情,或者是否将它们同步处理。在使用两个原始线程处理FooAsync
中的每个项目之前,是否从那里激发了两个独立线程,从而在ProcessItems
内部激发了另外两个独立线程?
答案 0 :(得分:2)
我的问题是Main()中的两个异步调用是否完成了任何事情,或者是否将它们同步处理。在使用两个原始线程处理ProcessItems中的每个项目之前,是否从那里激发了两个独立线程在FooAsync内部激发了另外两个独立线程?
异步与线程无关。使用async
时,最好采用异步思想(intro; best practices),而不要考虑how they're related to threads。
这两个FooAsync
调用将同时处理,并且每个调用都会进行两个并发的HTTP调用。
旁注:做async all the way而不是blocking on async code是正常的。因此,Main
中的代码将更自然地使用await Task.WhenAll(Task1, Task2);
而不是Task.WaitAll(Task1, Task2);
来表达。