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.DispatcherSystem.Windows.Threading.Dispatcher.CurrentDispatcher有区别:

Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher