Dispatcher.BeginInvoke(...) 如何更新 WPF 中的 UI 控件?
我读到 Dispatcher.BeginInvoke() 将在与 ThreadPool 不同的线程中运行。
正确吗?
如果它是正确的,那么我的问题是:如果它运行的是单独的线程,而不是 UI 线程,它将如何更新 UI?
I read that Dispatcher.BeginInvoke() will run in a separate thread from ThreadPool.
Is it correct?
If it is correct then my question is: If it running is separate thread which is not UI thread, how it will update the UI?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Dispatcher.BeginInvoke
安排在 UI 线程上调用的操作,并从后台线程调用以更新 UI 元素。Dispatcher.BeginInvoke
schedules an action to be called on the UI thread and is called from a background thread to update UI elements.在普通的 WPF 应用程序中,所有 UI 对象都与单个调度程序关联,并且调度程序与单个线程关联。 BeginInvoke 在与调度程序关联的线程上异步运行指定的委托(对于 UI 调度程序,它将是 UI 线程)。您只需从 UI 线程以外的线程调用 BeginInvoke(或与 BeginInvoke 相同但阻塞的 Invoke)。
如果要从 ThreadPool 线程中运行的代码更新 UI,请获取对 UI 调度程序的引用并调用 BeginInvoke 或 Invoke,它将将该调用转移到 UI 线程。
In ordinary WPF application all UI objects are associated with a single dispatcher and the dispatcher is associated with a single thread. BeginInvoke asynchronously runs a specified delegate on the thread associated with the dispatcher (in the case of a UI dispatcher it will be the UI thread). You only need to call BeginInvoke (or the Invoke which is same as BeginInvoke but blocking) from a thread other than the UI thread.
If you want to update UI from a code running in a ThreadPool's thread, get the reference to the UI dispatcher and call BeginInvoke or Invoke and it will transfer the call to the UI thread.