【问题标题】:How Dispatcher.BeginInvoke(...) updates the UI controls in WPF?Dispatcher.BeginInvoke(...) 如何更新 WPF 中的 UI 控件?
【发布时间】:2011-09-21 22:50:13
【问题描述】:

我了解到 Dispatcher.BeginInvoke() 将在与 ThreadPool 不同的线程中运行。

对吗?

如果正确,那么我的问题是:如果它运行的是单独的线程而不是 UI 线程,它将如何更新 UI?

【问题讨论】:

    标签: wpf wpf-controls dispatcher


    【解决方案1】:

    Dispatcher.BeginInvoke 安排一个动作在 UI 线程上调用,并从 后台线程 调用以更新 UI 元素。

    【讨论】:

    • 是的,后台线程是指除 UI 线程之外的任何线程。 WPF 中的 UI 线程注册了一个 Dispatcher,用于围绕渲染进行调度。
    • 谢谢,但对“除 UI 线程之外的任何线程”的说明很少。 UI线程只有一个,那么辅助线程如何更新UI线程?
    • @Syed - 调度员的工作就像一个循环中的工作队列。后台线程将回调添加到队列中,UI 线程在准备好时运行它。
    • 谢谢,我标记为正确答案。解释这些概念的示例或视频链接将很有用。
    【解决方案2】:

    在普通的 WPF 应用程序中,所有 UI 对象都与单个调度程序相关联,并且调度程序与单个线程相关联。 BeginInvoke 在与调度程序关联的线程上异步运行指定的委托(在 UI 调度程序的情况下,它将是 UI 线程)。您只需要从 UI 线程以外的线程调用 BeginInvoke(或与 BeginInvoke 相同但阻塞的 Invoke)。

    如果您想从 ThreadPool 线程中运行的代码更新 UI,请获取对 UI 调度程序的引用并调用 BeginInvoke 或 Invoke,它将调用转移到 UI 线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 2014-11-16
      相关资源
      最近更新 更多