Home > Mobile >  How Task.WhenAll works under the hood
How Task.WhenAll works under the hood

Time:10-21

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?

CodePudding user response:

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);
        }
    }
}
  • Related