我有一个我想按顺序执行的异步函数列表。当我运行以下代码时,我得到输出:
Task 1 before
Task 2 before
Finished tasks
为什么我的异步功能没有被正确等待?
[Test]
public async Task AsyncTaskList()
{
var data = "I'm data";
var tasks = new List<Func<object, Task>>() {Task1, Task2};
tasks.ForEach(async task =>
{
await task(data);
});
Debug.WriteLine("Finished tasks");
}
private static async Task Task1(object data)
{
Debug.WriteLine("Task 1 before");
await Task.Delay(1000);
Debug.WriteLine("Task 1 after");
}
private static async Task Task2(object data)
{
Debug.WriteLine("Task 2 before");
await Task.Delay(1000);
Debug.WriteLine("Task 2 after");
}
答案 0 :(得分:3)
由于await
委托中的ForEach
实际上在之后完成,因此该方法退出。将其更改为实际的foreach
循环,等待将按预期工作。
ForEach
没有针对Func<Task>
的具体处理(基类库中几乎没有委托接受方法,你应该注意到它们几乎总是会自己返回Task
)。 ForEach
只会运行lambda的同步部分 - 这就是之前的部分{/ 1}} await
的{{1}}没有同步完成(在你的情况下是Task
)。这就是为什么你在&#34;之前&#34;消息在预期时间弹出。一旦您的代理人点击Task.Delay
,您的lambda的其余部分预定将来某个时间运行,await Task.Delay
移动到列表中的下一个项目。然后,计划的任务延续将在未观察到的情况下运行并稍后完成。