Eri*_*fer 18 .net c# .net-2.0 winforms
我的应用程序GUI有时会停止重绘.有许多线程正在触发各种事件(如计时器或网络数据准备等).还有很多控件正在订阅这些事件.因此,所有事件处理程序都会播放InvokeRequired/Invoke游戏.现在我发现当GUI冻结时,很多线程都在等待Invoke()返回.看起来消息泵停止泵送.处理程序看起来像这样:
private void MyEventHandler( object sender, EventArgs e ) {
if ( InvokeRequired ) {
Invoke( new EventHandler( MyEventHandler ), sender, e );
return;
}
SetSomeStateVariable();
Invalidate();
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
解决方案:BeginInvoke().看起来如果你有很多CrossThread-Events,你应该总是使用BeginInvoke()......
谢谢.
谢谢大家.
编辑:看起来BeginInvoke()真的解决了它.直到现在都没有冻结.
Lou*_*nco 28
调用等待,直到在GUI线程中处理事件.如果你想让它是异步的,请使用BeginInvoke()
也许死锁?您是否确保在持有锁时事件永远不会被触发?
您是否能够通过附加调试器来查看此内容?如果是这样,请将其冻结,然后点击"暂停"按钮 - 并查看UI线程正在做什么.
请注意,如果您能够使用BeginInvoke而不是Invoke,生活会更容易,因为它不会阻止.
另请注意,您不需要"new EventHandler"位
Invoke((EventHandler) MyEventHandler, sender, e);
Run Code Online (Sandbox Code Playgroud)
应该没事.
| 归档时间: |
|
| 查看次数: |
11552 次 |
| 最近记录: |