wpf - 从多个后台线程更新 UI

标签 wpf multithreading invoke dispatcher windows-applications

这里的问题有点抽象。我们都知道,对于一个后台线程来更新一些 UI 元素。

Dispatcher.Invoke()

是唯一的选择(是吗?)。但是,Dispatcher.Invoke() 本身将更新任务委托(delegate)给 UI 线程。考虑以下情况:

  • 后台线程经常更新 UI。
  • 数十个线程更新同一个 UI。

Dispatcher 对象会继续将更新任务委托(delegate)给 UI 线程,而 UI 线程可能会变慢。什么是可能的解决方案?我们如何在线程模型与 WPF 非常相似的 Windows 窗体 中解决这样的问题? WPF 是否提供任何其他线程技术?

问候,

最佳答案

如果您通过发布消息(APC、委托(delegate)等)使 GUI 线程输入队列过载,速度快于它们的处理速度,那么无论 WPF/Forms/其他什么都会出现问题。

在多个 GUI 状态更新如此频繁以至于发布每个更改会使队列重载和/或导致显示变化太快以至于人类无法阅读的情况下,非 GUI 线程通常会存储它们的状态共享对象中的最新数据以及 GUI 线程以更合理的间隔使用计时器显示数据。

如果所有数据都必须无损显示(例如,GUI 备忘录或 HTML 渲染器必须显示所有发送的内容),则可能需要通过对象池和/或延迟发布数据进行适当的流量控制,以防止消息-队列过载。

'这里的问题有点抽象' - 不是那么抽象。我在繁忙的应用程序中多次遇到这个问题。在我的东西中,长时间的输入队列过载往往会导致死锁,因为我的线程间通信池中的所有对象都卡在已发布的消息中,这些消息未被处理并释放到池中,因为 GUI 被阻塞 - 试图获取一个对象来自空池:((

关于wpf - 从多个后台线程更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9734909/

相关文章:

java - 在java应用程序中通过方法调用我的eclipse插件

c# - 如何调用线程中使用的代码

c# - Word 加载项拖放到文档中

wpf - 使用uniformgrid将按钮排列成正方形

java - 多线程 - 同步对象的所有实例的 block

java - 具有非阻塞套接字的多线程

c - 通过管道将相同的数据发送到多个线程?

java - 调用 servlet 类中的方法

.net - wpf datagrid rowdetail 被截断

wpf - 编辑单元格时如何更改 WPF DataGrid 单元格背景?