为什么有时候Task比Thread明显慢?

时间:2011-07-09 22:35:50

标签: c# wpf multithreading mvvm

我正在使用MVVM模式制作WPF应用程序。我发现有时候Task比Thread明显慢。例如,在测试ViewModel中:

public void DoSomething()
{
    Stopwatch stopwatch = Stopwatch.StartNew();
    new Thread(() =>
        {
            Debug.Print(string.Format("Elapsed: {0}", stopwatch.ElapsedMilliseconds));
        }).Start();
}

输出通常为Elapsed: 0。它的成本为0毫秒。但是,如果我将Thread替换为Task。它可能花费5000~15000毫秒。

我试图在另一个WPF项目中重现这个,但失败了。

我的系统配置:

  • Visual Studio 2010 SP1
  • .NET Framework 4.0
  • Windows 7 64位。
  • 4GB RAM
  • AMD Phenom II 635(4核,2.9 GHz)

有什么想法吗?感谢。

(抱歉,我无法上传出现此问题的项目)

1 个答案:

答案 0 :(得分:13)

默认情况下,Task不会创建新线程,但会在线程池上排队。这意味着当所有线程池线程都忙时,任务可能会等待(在极端情况下无限长),直到它实际开始执行。

线程池尝试确定最佳线程数,并且每个核心至少创建一个线程。您可以使用ThreadPool.SetMinThreads()来提高使用的最小线程数,但要小心这一点,可能会降低性能。

另一种选择是创建自己的TaskScheduler,它完全按照你想要的方式使用线程。