为什么Thread和Task之间的性能差异如此之大?

Nic*_*ick 27 c# multithreading

Windows 7,Intel CORE i3,64位,RAM 4Gb,2.27 GHz
.NET Framework 4.0

我有以下代码:

static void Main(string[] args)
{
    var timer = new Stopwatch();
    timer.Start();

    for (int i = 0; i < 0xFFF; ++i)
    {
        // I use one of the following line at time
        Task.Factory.StartNew(() => { });
        new Thread(() => { }).Start();
    }

    timer.Stop();

    Console.WriteLine(timer.Elapsed.TotalSeconds);
    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

如果我使用Task,输出总是小于0.01秒,但如果我使用Thread,输出总是大于40秒!
这怎么可能?为什么这么大的差异?

Ree*_*sey 35

两者不一样.

当你使用时Task.Factory.StartNew,你正在安排一个任务来运行ThreadPool.当你创建一个新的Thread,你必须创建并启动一个新的线程.

在第一种情况下,线程已经创建并重用.这导致调度任务的开销要低得多,因为不必每次迭代都创建线程.

但请注意,行为并不相同.创建单独的线程时,每个任务都会获得自己的线程.他们都会马上开始.使用时Task.Factory.StartNew,它们被放入调度程序中运行ThreadPool,这将(可能)限制启动的并发线程数.这通常是一件好事,因为它可以防止发生过度推翻.