我正在使用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项目中重现这个,但失败了。
我的系统配置:
有什么想法吗?感谢。
(抱歉,我无法上传出现此问题的项目)
答案 0 :(得分:13)
默认情况下,Task
不会创建新线程,但会在线程池上排队。这意味着当所有线程池线程都忙时,任务可能会等待(在极端情况下无限长),直到它实际开始执行。
线程池尝试确定最佳线程数,并且每个核心至少创建一个线程。您可以使用ThreadPool.SetMinThreads()
来提高使用的最小线程数,但要小心这一点,可能会降低性能。
另一种选择是创建自己的TaskScheduler
,它完全按照你想要的方式使用线程。