当前位置:  开发笔记 > 编程语言 > 正文

Invoke()正在阻塞

如何解决《Invoke()正在阻塞》经验,为你挑选了2个好方法。

我的应用程序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()真的解决了它.直到现在都没有冻结.



1> Lou Franco..:

调用等待,直到在GUI线程中处理事件.如果你想让它是异步的,请使用BeginInvoke()


我知道.BeginInvoke可能只是隐藏问题.所有Invokes都无限期地阻止.

2> Jon Skeet..:

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

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

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

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

Invoke((EventHandler) MyEventHandler, sender, e);

应该没事.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有