gpt4 book ai didi

.net - 重 CPU 负载下的跨线程 BeginInvoke 阻塞

转载 作者:行者123 更新时间:2023-12-03 12:52:41 29 4
gpt4 key购买 nike

我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。

在繁重的 CPU 负载下,UI 会锁定。当我附加调试器时,它始终位于更新第 3 方图像控件的同一行代码中。

    public ICogImage DisplayImage
{
get { return this.ResultImageCogDisplay.Image; }
set
{
this.BeginInvoke((ThreadStart)delegate
{
this.ResultImageCogDisplay.Image = value;
});

}
}

如果我注释掉 setter 的实现,那么问题就消失了。

谁能解释为什么会这样?

更多信息:
  • 图像更新事件由图像采集卡定期(约 200 毫秒)生成。这些事件在不同的线程上引发。
  • 我相信第 3 方图像控件使用 ActiveX,它是康耐视视觉处理框架的一部分。
  • 图像约为。 900x800 8 位灰度
  • 表单上有 4 个这样的控件,每个控件都来自具有不同图像的不同线程。
  • 我已经尝试过使用和不使用 IsInvokeRequired() 检查,它似乎没有任何区别。

  • PostMessage 队列上的消息数量是否有任何限制,我在高 CPU 负载下遇到这些消息?

    最佳答案

    BeginInvoke将要在 UI 线程上执行的操作排队。如果您排队执行的操作太多,UI 无法跟上它们,您将压倒 UI 线程并且它会显示为挂起。尝试将事件限制到每秒一次,看看是否有帮助。

    关于.net - 重 CPU 负载下的跨线程 BeginInvoke 阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11961965/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com