c# - 为什么线程和任务之间的性能差异如此之大?

标签 c# multithreading

Windows 7,英特尔酷睿 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();
}

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

最佳答案

两者不一样。

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

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

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

关于c# - 为什么线程和任务之间的性能差异如此之大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13125105/

相关文章:

python - 使用谷歌应用程序引擎的线程型解决方案

C# 多源、不同线程、一个事件处理程序

c# - 当我在 c# 中的一个类中定义我的所有函数时,我是否在进行函数式编程?

c# - BigInteger 如何在内部存储值?

c# - 如何在 List<T>.BinarySearch 中有效地复制 ArrayList.BinarySearch?

c# - 无法将asp.net页面连接到MySQL数据库

c# - 视觉继承 - 将设计器中的控件添加到 TableLayoutPanel 中托管的面板

multithreading - QMutex::lock:在线程0xfe8(主线程?)中检测到死锁

c++ - 如何在不让用户等待的情况下管理多个线程?

multithreading - 如何在 Perl 中处理具有依赖关系的调度线程?