2013-12-16 57 views
7

MSDNTask.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

相關問題