执行异步任务列表
本文关键字:列表 任务 异步 执行 | 更新日期: 2023-09-27 18:34:44
我有一个要按顺序执行的异步函数列表。当我运行以下代码时,我得到输出:
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");
}
因为ForEach
委托中的await
实际上是在方法退出后完成的。将其更改为实际的foreach
循环,等待将按预期工作。
ForEach
没有针对Func<Task>
的特定处理(基类库中很少有委托接受方法这样做,您应该注意,它们几乎总是会自己返回Task
(。 ForEach
将仅运行 lambda 的同步部分 - 即不同步完成的Task
的第一个await
之前的部分(在您的情况下Task.Delay
(。这就是为什么您看到"之前"消息在预期时间弹出的原因。一旦您的委托命中 await Task.Delay
,您的 lambda 的其余部分就会计划在未来某个时候运行,ForEach
移动到列表中的下一项。然后,计划的任务延续将在未观察到的情况下运行,并在稍后完成。