Task.WhenAll() – 它是否创建了一个新线程?

根据MSDN :

创建一个任务,该任务将在所有提供的任务完成后完成。

当调用Task.WhenAll()时,它会创建一个任务,但这是否意味着它创建了一个新线程来执行该任务? 例如,下面的控制台应用程序中创建了多少个线程?

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不创建新线程。 “任务”并不一定意味着一个线程; 有两种类型的任务:“事件”任务(例如, TaskCompletionSource )和“代码”任务(例如, Task.Run )。 WhenAll是一个事件样式的任务,因此它不代表代码。 如果你是async新手,我建议从我的介绍性博客文章开始 。

您的测试应用程序将根据需要使用线程池线程和IOCP线程来完成async方法,因此它可以运行少至2个线程或多达5个。如果您对线程的确切运行方式感到好奇,可以检查我最近关于async线程的博客文章 。