首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中通过线程更新UI的其他方法

在C#中通过线程更新UI的其他方法
EN

Stack Overflow用户
提问于 2012-03-22 23:16:18
回答 4查看 464关注 0票数 2

我的应用程序在很大程度上依赖于线程来完成非常大的数据的复杂处理。在处理过程中,需要更新UI。我知道并尝试使用BackgroundWorker'sOnProgressChangedRunWorkerCompleted方法来更新UI。还使用了UI线程的Invoke方法进行更新。在Win XP 32位和64位操作系统上,一切似乎都运行正常。在Win Vista和Win 7 (32和64位)上,应用程序在使用Invoke方法更新UI时随机挂起。

在不同的Win操作系统上,Invoke的行为是否会发生变化?除了Invoke之外,还有哪些从线程更新UI的其他方法

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-22 23:59:45

在不同的Win操作系统上调用的行为会发生变化吗?

它不应该,不。但是,线程问题可能会以非常不可预测的方式出现。有可能你有一个未知的问题。

除了Invoke之外,还有哪些从线程更新UI的其他方法?

使用InvokeBeginInvoke被过度使用了,特别是在试图向UI线程报告简单的进度信息时。如果你搜索我的一些与这个主题相关的答案,你会发现我一直在抨击这种方法。而且有很好的理由,因为使用这种技术有很多缺点。不幸的是,BackgroundWorker通过其ProgressChanged事件专门使用此机制来更新UI。

另一种方法是让工作线程将进度信息发布到共享变量中,并让UI线程通过计时器定期轮询进度信息。下面是我用来证明这种方法优于封送处理技术的一些常用的谈话要点。

  • Invoke和operations.
  • The是开销很大的imposes.
  • There,UI线程可以指定何时以及以何种频率更新窗体及其控件。
  • 它消除了UI线程和工作线程之间的紧密耦合,即ISynchronizeInvoke BeginInvoke不会因为一堆封送处理operations.
  • You而使UI消息队列溢出或饱和,从而在工作线程上获得更多吞吐量,因为它不必像Invoke.

那样等待响应

票数 2
EN

Stack Overflow用户

发布于 2012-03-22 23:34:33

我不确定出了什么问题,但是您可以始终只运行一个定期更新图形用户界面的System.Windows.Forms.Timer;使用一些成员变量在线程之间传递原始数据,如果需要,可以在锁中传递原始数据。这不是最优雅的解决方案,但它可能会为您提供一个不同的视角来了解挂起的内容,因为这样线程更独立,而不是依赖于后台线程来Invoke您的主线程。

票数 2
EN

Stack Overflow用户

发布于 2012-03-22 23:27:37

您可以尝试使用采用Dispatcher.Priority枚举作为参数的Invoke()或BeginInvoke()重载之一。如果你选择了一个参数,比如'Background‘,你应该会看到你的应用程序仍然在响应。那么,唯一的问题就是确保您以适当的速率为传入数据提供服务,而不会不断增加队列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9825175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档