2013-12-16 6 views
7

По MSDN:Task.WhenAll() - создает ли новый поток?

Создает задачу, которая будет завершена, когда все предоставленные задачи выполнили.

Когда вызывается Task.WhenAll(), он создает задачу, но обязательно ли это означает, что он создает новый поток для выполнения этой задачи? Например, сколько потоков создано в этом консольном приложении ниже?

class Program 
{ 
    static void Main(string[] args) 
    { 
     RunAsync(); 
     Console.ReadKey(); 
    } 

    public static async Task RunAsync() 
    { 

     Stopwatch sw = new Stopwatch(); 
     sw.Start(); 
     Task<string> google = GetString("http://www.google.com"); 
     Task<string> microsoft = GetString("http://www.microsoft.com"); 
     Task<string> lifehacker = GetString("http://www.lifehacker.com"); 
     Task<string> 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<string> GetString(string url) 
    { 
     using (var client = new HttpClient()) 
     { 
      return await client.GetStringAsync(url); 
     } 
    } 
} 

ответ

9

WhenAll не создает новую тему. «Задача» необязательно подразумевает поток; существуют два типа задач: «события» (например, TaskCompletionSource) и «кодовые» задачи (например, Task.Run). WhenAll - задача в стиле события, поэтому она не представляет код. Если вы новичок в async, я рекомендую начать с моего introductory blog post.

Ваше тестовое приложение будет использовать потоки пула потоков и потоки IOCP по мере необходимости, чтобы закончить методы async, поэтому он может работать с целым числом потоков 2 или 5. Если вам интересно, как точно работает потоковая обработка , вы можете проверить мой номер recent blog post on async threads.

+0

Этот связанный пост действительно приятный. Ты сделал меня верующим;) – Kris

Смежные вопросы