我的应用程序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()
真的解决了它.直到现在都没有冻结.
调用等待,直到在GUI线程中处理事件.如果你想让它是异步的,请使用BeginInvoke()
也许死锁?您是否确保在持有锁时事件永远不会被触发?
您是否能够通过附加调试器来查看此内容?如果是这样,请将其冻结,然后点击"暂停"按钮 - 并查看UI线程正在做什么.
请注意,如果您能够使用BeginInvoke而不是Invoke,生活会更容易,因为它不会阻止.
另请注意,您不需要"new EventHandler"位
Invoke((EventHandler) MyEventHandler, sender, e);
应该没事.