执行异步任务列表

时间:2016-02-15 00:46:34

标签: c# asynchronous async-await

我有一个我想按顺序执行的异步函数列表。当我运行以下代码时,我得到输出:

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");
    }

1 个答案:

答案 0 :(得分:3)

由于await委托中的ForEach实际上在之后完成,因此该方法退出。将其更改为实际的foreach循环,等待将按预期工作。

ForEach没有针对Func<Task>的具体处理(基类库中几乎没有委托接受方法,你应该注意到它们几乎总是会自己返回Task)。 ForEach只会运行lambda的同步部分 - 这就是之前的部分{/ 1}} await的{​​{1}}没有同步完成(在你的情况下是Task)。这就是为什么你在&#34;之前&#34;消息在预期时间弹出。一旦您的代理人点击Task.Delay,您的lambda的其余部分预定将来某个时间运行,await Task.Delay移动到列表中的下一个项目。然后,计划的任务延续将在未观察到的情况下运行并稍后完成。