【问题标题】:Task.Run not running in background but on Dispatcher [duplicate]Task.Run 不在后台运行,而是在 Dispatcher [重复]
【发布时间】:2018-09-07 23:05:33
【问题描述】:

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

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

在 if 语句中放置断点。

这是预期的行为吗?我理解 Task.Run 使用不同的线程。

【问题讨论】:

    标签: c# wpf task-parallel-library


    【解决方案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

    【讨论】:

    • 我知道我一定做了一些愚蠢的事情。谢谢。
    • 自动补全很容易误输入 Dispatcher.CurrentDispatcher。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2013-06-15
    • 2018-01-15
    • 2013-09-21
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多