【发布时间】:2011-09-13 05:13:07
【问题描述】:
代码:
static void DoIt(string name)
{
Console.WriteLine("Hello {0} | {1}", name, Thread.CurrentThread.ManagedThreadID);
Thread.Sleep(5000);
Console.WriteLine("Bye {0} | {1}", name, Thread.CurrentThread.ManagedThreadID);
}
static void Main()
{
Task.Factory.StartNew(() => DoIt("One"));
Task.Factory.StartNew(() => DoIt("Two"));
Task.Factory.StartNew(() => DoIt("Three"));
Task.Factory.StartNew(() => DoIt("Four"));
Task.Factory.StartNew(() => DoIt("Five"));
Task.Factory.StartNew(() => DoIt("Six"));
Task.Factory.StartNew(() => DoIt("Seven"));
Task.Factory.StartNew(() => DoIt("Eight"));
Task.Factory.StartNew(() => DoIt("Nine"));
Task.Factory.StartNew(() => DoIt("Ten"));
Console.ReadKey();
}
为什么它可以立即启动前 3 个任务,但是任务 4 启动需要 5-10 秒,任务 4 启动后,任务 5 启动需要 5-10 秒等等。是 GC 在做某事吗?有人可以澄清发生了什么吗?
【问题讨论】:
-
您认为您的 CPU 有多少个内核?在这种情况下,这不是一个细节...... :)
-
我在一个启动 100 个任务的网络 IO 密集型应用程序中看到了相同的行为。实际上需要 100 个任务才能接近最大系统吞吐量,但后面的任务需要很长时间才能启动。
-
@Davide:你知道 TPL 假设任务是 CPU 绑定的还是只是假设?很高兴知道情况是否如此。
-
我什么都不知道...我猜。 :) 在我的猜测中,创建多个执行单元(核心)数量较少的并发操作只能意味着整体执行速度比一个接一个地做事要慢,如果没有其他事情的话,至少会有一些上下文切换或调度的开销。反正这里不是 TPL 专家。
-
你有 AMD 3 核的机器吗?
标签: c# multithreading