注意:这基本上只是说明我对async
. 也许它可以帮助其他困惑的人。
我在一个循环中做一些HttpClient
async
await
请求,我注意到这些请求似乎是按顺序完成的(它在开始下一次迭代之前等待结果)。
所以我尝试使用await Task.Delay
循环而不是网络请求进行测试。
也许我已经失去了情节,但我会认为await
在一个循环中可能会导致循环的下一次迭代在等待结果时开始。相反,似乎一切都是按顺序执行的:
int _iterations = 1000;
int _count= 0;
Stopwatch _stopwatch = new Stopwatch();
_stopwatch.Start();
for (int i = 0; i < _iterations; i++)
{
Console.WriteLine("Elapsed: {0}. Calls count: {1}.", _stopwatch.Elapsed, ++_count);
await Task.Delay(5000);
Console.WriteLine("Calls count again: {0}", _count);
}
这导致:
Elapsed: 00:00:00.0000059. Calls count: 1.
Calls count again: 1
Elapsed: 00:00:05.0022733. Calls count: 2.
Calls count again: 2
Elapsed: 00:00:10.0100470. Calls count: 3.
Calls count again: 3
Elapsed: 00:00:15.0182479. Calls count: 4.
是的,我可以省略await
并将返回Task
的 s 添加到某个数组并使用Task.WhenAll
. 但令我惊讶的await
是,它在我的循环中被阻塞,并且它都是按顺序执行的。这是正常的吗?
编辑:所以总而言之:我在那里有点困惑。控制返回到循环外部await
。这是有道理的,因为它模仿了同步类比,但当然不会阻塞线程。