在调查后发现问题的根源似乎是Task.Run实际上在Dispatcher线程中运行时,我有一项CPU密集型任务阻塞了UI线程:
Task.Run(() =>
{
if (Dispatcher.CurrentDispatcher.Thread == Thread.CurrentThread)
{
// breakpoint
}
});
在if语句中插入一个断点。
这是预期的行为吗?我了解Task.Run使用其他线程。
答案 0 :(得分:1)
如果使用默认任务计划程序(默认情况下),则传递给Task.Run
的操作将在线程池线程上执行。
这应该给您预期的结果:
Task.Run(() =>
{
if (System.Windows.Application.Current.Dispatcher.Thread == Thread.CurrentThread)
{
// breakpoint not hit in WPF...
}
});
System.Windows.Application.Current.Dispatcher
和System.Windows.Threading.Dispatcher.CurrentDispatcher
之间是有区别的:
Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher