我的应用程序 GUI 有时会停止重绘。
有很多线程正在触发各种事件(例如计时器或网络数据就绪等)。还有很多控件正在订阅这些事件。因此,所有事件处理程序都会玩 InvokeRequired/Invoke 游戏。
现在我发现当 GUI 冻结时,很多线程正在等待 Invoke() 返回。看起来消息泵已停止泵送。
处理程序如下所示:
private void MyEventHandler( object sender, EventArgs e ) {
if ( InvokeRequired ) {
Invoke( new EventHandler( MyEventHandler ), sender, e );
return;
}
SetSomeStateVariable();
Invalidate();
}
有任何想法吗?
解决方案:BeginInvoke()。看起来如果你有很多跨线程事件,你应该总是使用 BeginInvoke()...
Thanks.
谢谢大家。
EDIT:好像BeginInvoke()
真的解决了。到现在还没结冰。
Invoke 会等待,直到事件在 GUI 线程中得到处理。如果您希望它是异步的,请使用 BeginInvoke()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)