5

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

    // 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()。

我究竟做错了什么?提前致谢。

4

1 回答 1

21

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

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

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

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

于 2012-11-17T15:41:50.697 回答