【问题标题】:Task.WhenAll() - does it create a new thread?Task.WhenAll() - 它会创建一个新线程吗?
【发布时间】:2014-01-04 12:07:05
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 那个链接的帖子真的很好。你让我成为了一个信徒;)
    • 对于可能试图弄清楚为什么 OP 的代码中涉及线程池线程的人,他在这里解释:stackoverflow.com/questions/43237250/…
    猜你喜欢
    • 2020-04-07
    • 2015-01-31
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2020-06-10
    • 2014-04-13
    • 2013-07-19
    相关资源
    最近更新 更多