Task.Run不是在后台运行,而是在Dispatcher上运行

时间:2018-09-07 14:46:11

标签: c# wpf task-parallel-library

在调查后发现问题的根源似乎是Task.Run实际上在Dispatcher线程中运行时,我有一项CPU密集型任务阻塞了UI线程:

Task.Run(() =>
{
    if (Dispatcher.CurrentDispatcher.Thread == Thread.CurrentThread)
    {
        // breakpoint
    }
});

在if语句中插入一个断点。

这是预期的行为吗?我了解Task.Run使用其他线程。

1 个答案:

答案 0 :(得分:1)

如果使用默认任务计划程序(默认情况下),则传递给Task.Run的操作将在线程池线程上执行。

这应该给您预期的结果:

Task.Run(() =>
{
    if (System.Windows.Application.Current.Dispatcher.Thread == Thread.CurrentThread)
    {
        // breakpoint not hit in WPF...
    }
});

System.Windows.Application.Current.DispatcherSystem.Windows.Threading.Dispatcher.CurrentDispatcher之间是有区别的:

Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher