我的应用程序在很大程度上依赖于线程来完成非常大的数据的复杂处理。在处理过程中,需要更新UI。我知道并尝试使用BackgroundWorker's、OnProgressChanged和RunWorkerCompleted方法来更新UI。还使用了UI线程的Invoke方法进行更新。在Win XP 32位和64位操作系统上,一切似乎都运行正常。在Win Vista和Win 7 (32和64位)上,应用程序在使用Invoke方法更新UI时随机挂起。
在不同的Win操作系统上,Invoke的行为是否会发生变化?除了Invoke之外,还有哪些从线程更新UI的其他方法
谢谢
发布于 2012-03-22 23:59:45
在不同的Win操作系统上调用的行为会发生变化吗?
它不应该,不。但是,线程问题可能会以非常不可预测的方式出现。有可能你有一个未知的问题。
除了Invoke之外,还有哪些从线程更新UI的其他方法?
使用Invoke或BeginInvoke被过度使用了,特别是在试图向UI线程报告简单的进度信息时。如果你搜索我的一些与这个主题相关的答案,你会发现我一直在抨击这种方法。而且有很好的理由,因为使用这种技术有很多缺点。不幸的是,BackgroundWorker通过其ProgressChanged事件专门使用此机制来更新UI。
另一种方法是让工作线程将进度信息发布到共享变量中,并让UI线程通过计时器定期轮询进度信息。下面是我用来证明这种方法优于封送处理技术的一些常用的谈话要点。
Invoke和operations.ISynchronizeInvoke BeginInvoke不会因为一堆封送处理operations.Invoke.那样等待响应
发布于 2012-03-22 23:34:33
我不确定出了什么问题,但是您可以始终只运行一个定期更新图形用户界面的System.Windows.Forms.Timer;使用一些成员变量在线程之间传递原始数据,如果需要,可以在锁中传递原始数据。这不是最优雅的解决方案,但它可能会为您提供一个不同的视角来了解挂起的内容,因为这样线程更独立,而不是依赖于后台线程来Invoke您的主线程。
发布于 2012-03-22 23:27:37
您可以尝试使用采用Dispatcher.Priority枚举作为参数的Invoke()或BeginInvoke()重载之一。如果你选择了一个参数,比如'Background‘,你应该会看到你的应用程序仍然在响应。那么,唯一的问题就是确保您以适当的速率为传入数据提供服务,而不会不断增加队列。
https://stackoverflow.com/questions/9825175
复制相似问题