Invoke()正在阻塞

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()

  • 我知道.BeginInvoke可能只是隐藏问题.所有Invokes都无限期地阻止. (2认同)

Jon*_*eet 6

也许死锁?您是否确保在持有锁时事件永远不会被触发?

您是否能够通过附加调试器来查看此内容?如果是这样,请将其冻结,然后点击"暂停"按钮 - 并查看UI线程正在做什么.

请注意,如果您能够使用BeginInvoke而不是Invoke,生活会更容易,因为它不会阻止.

另请注意,您不需要"new EventHandler"位

Invoke((EventHandler) MyEventHandler, sender, e);
Run Code Online (Sandbox Code Playgroud)

应该没事.