C# wait Task.WhenAll()在未等待的任务中

C# wait Task.WhenAll()在未等待的任务中,c#,task-parallel-library,async-await,C#,Task Parallel Library,Async Await,我的问题是,当一个任务有一个Task.WhenAll()调用(运行其他任务)时,WhenAll()行使消费代码继续执行,这与我预期的不同。因此,下面的代码在点击Task.WhenAll()时立即输出“finished”,而不是在其参数中的所有任务都完成之后 // Just a simple async method public Task DoWorkAsync() { return Task.Factory.StartNew( (

我的问题是,当一个任务有一个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()

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

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

它是与的异步等效,如果要阻止,则使用此方法

然而,你还有另一个问题。使用和传递
async
委托似乎会导致一种类型的
任务
,其中外部任务在内部任务开始执行时完成(而不是在内部任务完成时)


使用较新版本可以避免这种情况。

你说得对:问题在于任务,我忽略了它。顺便说一句,我不希望线程阻塞,只希望在前面的任务完成后继续执行。这就是为什么我使用Task.WhenAll()而不是与aync wait构造一起使用wait。非常感谢你的帮助!如果您想了解
Task.Run
及其所有优点(以及它为什么和如何完成任务),请点击此处: