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

Pie*_*one 4 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");
Run Code Online (Sandbox Code Playgroud)

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

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

Ric*_*ard 19

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

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

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

使用新版本Task.Run可以避免这种情况.