【问题标题】:What is the difference between Dispatcher.BeginInvoke and Task.Factory.StartNewDispatcher.BeginInvoke 和 Task.Factory.StartNew 有什么区别
【发布时间】:2012-03-31 15:07:32
【问题描述】:

在我的 WPF 应用程序中,我在构造函数中使用 Dispatcher.BeginInvoke 加载内容。我的问题是它会阻塞 UI 线程吗?

或者最好使用Task.Factory.StartNew,然后在 UI 上分派内容,以便应用程序首先加载,而不管加载内容的处理时间如何?

哪种方法更好,为什么?

【问题讨论】:

    标签: c# wpf task-parallel-library


    【解决方案1】:

    他们做了两件非常不同的事情:

    • Task.Factory.StartNew 安排委托在 线程池线程。当前线程继续运行而不等待此任务的结果(异步)。通常,您会生成一个运行时间较长的后台任务,以便 UI 不会被阻塞太久(不是“冻结”)。

    • Dispatcher.BeginInvoke 安排委托在 调度程序(UI)线程。通常这样做是为了更新一些 UI 控制与在 a 上执行的某些操作的结果 后台线程。本质上,您是在此处更新 UI。

    直接回答你的问题:

    您不应在 Dispatcher 线程上安排冗长的操作,通常您只想在此处更新 UI 控件。委托中的代码将在 UI 线程上执行,该线程在执行期间被阻塞。只需将Thread.Sleep(10000) 放入您当前的代码(您从构造函数中安排),您就会看到 UI 将冻结。为此使用后台任务 - 使用 Task 或后台工作者(两者都将使用线程池线程)。

    或者使用Task.Factory.StartNew然后调度更好 事情回到 UI 上,这样应用程序将首先加载,而不管 加载内容处理时间。

    是的!

    【讨论】:

    • 感谢您的回复,Dispatcher.BeginInvoke 会在我的应用程序中阻止 UI..我需要在加载时调用一些服务,如果服务停止,那么它会挂起 UI,尽管我使用了 Dispatcher.BeginInvoke 所以我的基本问题是在这种情况下使用调度程序或任务?
    • 如果你想要在后台运行的东西使用任务,如果你想要将结果发送到用户界面使用Dispatcher.BeginInvoke
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    相关资源
    最近更新 更多