等待任务中的Task.WhenAll()没有等待

时间:2012-11-17 15:34:40

标签: c# task-parallel-library async-await

我的问题是当一个Task有一个Task.WhenAll()调用(运行其他任务)时,WhenAll()行让消费代码继续执行,这与我的预期不同。因此,当命中Task.WhenAll()时,以下代码立即输出“finished”,而不是在其参数中的所有任务完成后输出。

    // Just a simple async method
    public Task DoWorkAsync()
    {
        return Task.Factory.StartNew(
            () =>
            {
                // Working
            });
    }

    // This one used the previous one with Task.WhenAll()
    public Task DoLoadsOfWorkAsync()
    {
        return Task.Factory.StartNew(
            async () =>
            {
                // Working
                // This line makes the task return immediately
                await Task.WhenAll(DoWorkAsync(), DoWorkAsync());
                // Working
            });
    }

    // Consuming code
    await DoLoadsOfWorkAsync();
    Console.WriteLine("finished");

我希望在执行DoLoadsOfWorkAsync()的最后一行时调用WriteLine()。

我做错了什么?提前谢谢。

1 个答案:

答案 0 :(得分:18)

Task.WhenAll立即返回一个新的Task,它不会阻止。传递给WhenAll的所有任务都已完成后,返回的任务将完成。

它是Task.WaitAll的异步等价物,如果你想阻止它,这就是使用的方法。

但是你有另一个问题。使用Task.Factory.StartNew并传递async委托似乎导致一种Task<Task>类型,其中外部任务在内部任务开始执行时完成(而不是在完成时)。

使用较新的Task.Run可以避免这种情况。