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

时间:2013-12-16 22:20:40

标签: c# .net asynchronous async-await task-parallel-library

根据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<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);
        }
    }
}

1 个答案:

答案 0 :(得分:12)

WhenAll不会创建新主题。 “任务”并不一定意味着一个线程;有两种类型的任务:“事件”任务(例如,TaskCompletionSource)和“代码”任务(例如,Task.Run)。 WhenAll是一个事件样式的任务,因此它不代表代码。如果您是async的新用户,我建议您从我的introductory blog post开始。

您的测试应用程序将根据需要使用线程池线程和IOCP线程来完成async方法,因此它可以运行少至2个线程或多达5个。如果您对如何确切地感到好奇线程有效,您可以查看我的recent blog post on async threads