【发布时间】:2021-10-31 18:26:36
【问题描述】:
private async void btnTest_Click(object sender, EventArgs e)
{
List<Task> lstTasks = new List<Task>();
foreach (int val in lstItems)
{
lstTasks.Add(MyAsyncMtd(val));
}
await Task.WhenAll(lstTasks);
...
}
private async Task MyAsyncMtd(int val)
{
...
await Task.Delay(1000);
...
}
问题:单击按钮时,在 for 循环的第一次迭代中,当遇到 MyAsyncMtd 中的 await 关键字时,我知道控制权转到了调用者。本例中的调用者是按钮单击方法。这是否意味着在第一次迭代的 Task.Delay 上等待 (Task.Delay) 时下一次迭代得到处理(换句话说 - 是否等待 return 任务给调用者?)?或者到底发生了什么?
【问题讨论】:
-
"这是否意味着在等待时会处理下一个迭代(Task.Delay)" -> 是的。
-
从技术上讲,这是第一个可能创建延续的等待。但是,当您调用异步方法而不等待它时,它会启动任务热。因此,您一次创建了许多任务,然后等待它们。在这个楼层的制作过程中没有任何迭代受到伤害
-
如果我这样做
lstTasks.Add(await MyAsyncMtd(val));会发生什么? -
同样的事情会降低装船的效率。你可以整天玩这个游戏,(这个和那个什么的以及其他什么)它并不能解决你的一般研究问题
标签: c# winforms asynchronous async-await