Await Task.WhenAll() inside task not awaiting

async-await, c#, task-parallel-library

Solution

`Task.WhenAll` returns a new `Task` immediately, it does not block. The returned task will complete when all tasks passed to `WhenAll` have completed.

It is an asynchronous equivalent to `Task.WaitAll`, and this is the method to use if you want to block.

However you have another problem. Using `Task.Factory.StartNew` and passing an `async` delegate seems to lead to a type of `Task<Task>` where the outer task completes when the inner task starts to execute (rather than when it has completed).

Using the newer `Task.Run` avoids this.

Problem

My problem is that when a Task has a Task.WhenAll() call (running other Tasks) the line of WhenAll() makes the consuming code continue execution, unlike what I would expect. So the following code outputs "finished" immediately when the Task.WhenAll() is hit, not after all the tasks in its argument are 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"); ``` I'd expect the WriteLine() to be called when the last line of DoLoadsOfWorkAsync() is executed. What am I doing wrong? Thanks in advance.

Original source