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

4 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();
}
Run Code Online (Sandbox Code Playgroud)

输出通常是Elapsed: 0.它的成本为0毫秒.但是,如果我取代ThreadTask.它可能花费5000~15000毫秒.

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

我的系统配置:

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

有任何想法吗?谢谢.

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

svi*_*ick 13

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

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

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

  • @caveman,不要忘记,如果你有100个任务,那么在100个线程上执行它们不是*最快的方法.并且您不应该将线程池用于对UI响应性很重要的任务. (4认同)