【发布时间】:2020-02-20 20:46:24
【问题描述】:
在下面的示例中,我有一个使用标志异步调用的方法。
在该方法中,它将异步进行两个单独的网络调用,并在两个都被调用并且需要结果之后等待它们。一旦获得了两者的结果,它将调用一个方法,该方法一次处理两个网络调用的结果。每个项目都需要一个网络调用,就本问题而言,该调用不能异步进行,必须立即等待。
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() 中的两个异步调用是否完成了任何事情,或者它们是否会被同步处理。在使用两个原始线程处理ProcessItems 中的每个项目之前,是否有两个独立线程从那里触发,它们在FooAsync 中触发了另外两个独立线程?
【问题讨论】:
-
2 个
FooAsync调用将异步运行。Task.WaitAll将阻塞直到两者都完成,但任务本身将并行运行。 -
如果你能发布真实的代码就好了。为了编译它,我必须对您的代码进行大量更改。如果我们不得不使用您的代码,这将很难回答。
标签: c# multithreading asynchronous