【发布时间】:2008-11-13 14:55:06
【问题描述】:
我的应用程序 GUI 有时会停止重绘。 有很多线程正在触发各种事件(如计时器或网络数据就绪等)。还有很多订阅这些事件的控件。因此,所有事件处理程序都玩 InvokeRequired/Invoke 游戏。 现在我发现当 GUI 冻结时,很多线程都在等待 Invoke() 返回。看起来消息泵停止了泵送。 处理程序如下所示:
private void MyEventHandler( object sender, EventArgs e ) {
if ( InvokeRequired ) {
Invoke( new EventHandler( MyEventHandler ), sender, e );
return;
}
SetSomeStateVariable();
Invalidate();
}
有什么想法吗?
解决方案:BeginInvoke()。如果您有很多 CrossThread-Events,您应该始终使用 BeginInvoke()...
谢谢。
谢谢大家。
编辑: 看起来BeginInvoke() 真的解决了它。直到现在都没有冻结。
【问题讨论】:
-
当它冻结时谁在编组?它是一个特定的控件或事件,还是随机的?
-
我不太明白你的意思。
-
您的事件一次一个地编组到 UI 线程。在此过程中有人阻塞。我在问每次阻塞时是否编组相同的方法,和/或每次阻塞时更新的控件是否相同。
-
我不知道,因为我只在调试器中捕获过一次。在这种情况下,“不时”的意思是“可能在 6 个月内十次,并且只有一次在带有调试器的盒子上”。