执行异步任务列表

本文关键字:列表 任务 异步 执行 | 更新日期: 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移动到列表中的下一项。然后,计划的任务延续将在未观察到的情况下运行,并在稍后完成。