Task.Run 不是 运行 在后台,而是在 Dispatcher
Task.Run not running in background but on Dispatcher
我的一项 CPU 密集型任务阻塞了 UI 线程,经过调查我发现问题的根源似乎是 Task.Run 实际上 运行 在 Dispatcher 线程中:
Task.Run(() =>
{
if (Dispatcher.CurrentDispatcher.Thread == Thread.CurrentThread)
{
// breakpoint
}
});
在 if 语句中设置断点。
这是预期的行为吗?我理解 Task.Run 使用不同的线程。
如果您使用默认任务计划程序(默认情况下您是),您传递给 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
我的一项 CPU 密集型任务阻塞了 UI 线程,经过调查我发现问题的根源似乎是 Task.Run 实际上 运行 在 Dispatcher 线程中:
Task.Run(() =>
{
if (Dispatcher.CurrentDispatcher.Thread == Thread.CurrentThread)
{
// breakpoint
}
});
在 if 语句中设置断点。
这是预期的行为吗?我理解 Task.Run 使用不同的线程。
如果您使用默认任务计划程序(默认情况下您是),您传递给 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