我有一个Windows用户控件,它包含一个第三方图像显示控件,该控件使用BeginInvoke委托调用从一个单独的线程更新。
在CPU负载很重的情况下,UI会锁定。当我附加调试器时,它总是在更新第三方图像控件的同一代码行上。
public ICogImage DisplayImage
{
get { return this.ResultImageCogDisplay.Image; }
set
{
this.BeginInvoke((ThreadStart)delegate
{
this.ResultImageCogDisplay.Image = value;
});
}
}
如果我注释掉了setter的实现,那么问题就消失了。
,有人能解释为什么会发生这种事吗?
更多信息:
对PostMessage队列上的消息数量是否有限制,我是在高CPU负载下访问的?
发布于 2012-08-14 23:07:53
BeginInvoke
对要在UI线程上执行的操作进行排队。如果您排队的事情足够多,使UI无法跟上它们,您将淹没UI线程,并且它将显示为挂起。尝试将事件控制在每秒一次,看看这是否有帮助。
发布于 2012-08-14 23:45:59
实际上,Windows消息队列条目(至少在32位系统上是这样)有10,000个条目的限制。在此之前很久,通过发布比GUI更快的消息来筛选GUI是非常容易的--我经常这样做:(
通常,我的设计使用一个对象池来进行线程间通信,所以我解决了这个问题,因为如果GUI没有足够快地返回“二手”对象,那么生产者线程就会在池队列中被阻塞,从而提供整体流控制。当然,在停止GUI锁定的同时,如果您有无法满足的帧率要求,则这不会有多大帮助:
https://stackoverflow.com/questions/11961965
复制相似问题