Task.WhenAll () – ¿crea un nuevo hilo?

Según MSDN :

Crea una tarea que se completará cuando todas las tareas proporcionadas se hayan completado.

Cuando se llama a Task.WhenAll (), crea una tarea, pero ¿eso significa necesariamente que crea un nuevo hilo para ejecutar esa tarea? Por ejemplo, ¿cuántos hilos se crean en esta aplicación de consola a continuación?

class Program { static void Main(string[] args) { RunAsync(); Console.ReadKey(); } public static async Task RunAsync() { Stopwatch sw = new Stopwatch(); sw.Start(); Task google = GetString("http://www.google.com"); Task microsoft = GetString("http://www.microsoft.com"); Task lifehacker = GetString("http://www.lifehacker.com"); Task engadget = GetString("http://www.engadget.com"); await Task.WhenAll(google, microsoft, lifehacker, engadget); sw.Stop(); Console.WriteLine("Time elapsed: " + sw.Elapsed.TotalSeconds); } public static async Task GetString(string url) { using (var client = new HttpClient()) { return await client.GetStringAsync(url); } } } 

WhenAll no crea un nuevo hilo. Una “tarea” no implica necesariamente un hilo; hay dos tipos de tareas: tareas de “evento” (por ejemplo, TaskCompletionSource ) y tareas de “código” (por ejemplo, Task.Run ). WhenAll es una tarea de estilo de evento, por lo que no representa código. Si eres nuevo en async , te recomiendo comenzar con mi entrada introductoria al blog .

Su aplicación de prueba utilizará subprocesos de subprocesos y subprocesos IOCP según sea necesario para finalizar los métodos async , por lo que puede ejecutarse con tan solo 2 subprocesos o tantos como 5. Si tiene curiosidad acerca de cómo funciona exactamente el subprocesamiento, puede verificar a cabo mi reciente publicación de blog en hilos async .