yaewrud
yaewrud

Reputation: 37

How Task.WhenAll works under the hood

How does Task.WhenAll works under the hood? Does it create separate thread which finished once all of tasks receive callback about finish. I have a suggestion, that under the hood it creates new thread and pass work to system drivers for each of the task and waits for them at the end, but not sure about is it correct or not?

Upvotes: 1

Views: 541

Answers (1)

Ben Voigt
Ben Voigt

Reputation: 283664

No, Task.WhenAll doesn't create a thread. It is possible that some of the element tasks passed to Task.WhenAll have created threads (but optimally they would not). Task.WhenAll itself just calls ContinueWith on the element tasks, passing a piece of code that checks the other task states. There is no "wait".


Here is an example of how Task.WhenAll may be implemented. (It is not the Microsoft code)

Task MyWhenAll(IEnumerable<Task> tasks)
{
    var a = tasks.ToArray();
    var tcs = new TaskCompletionSource<bool>();
    Array.ForEach(a, WatchTask);
    return tcs.Task;

    async void WatchTask(Task t)
    {
        try {
            await t;
        }
        catch {}

        if (a.All(element => element.IsCompleted)) {
            if (a.Any(element => element.IsFaulted))
                // omitted logic for adding each individual exception
                // to the aggregate
                tcs.TrySetException(new AggregateException());
            else
                tcs.TrySetResult(true);
        }
    }
}

Upvotes: 2

Related Questions