C# BeginInvoke正在锁定UI

C# BeginInvoke正在锁定UI,c#,winforms,user-interface,asynchronous,begininvoke,C#,Winforms,User Interface,Asynchronous,Begininvoke,我正在开发一个应用程序,显示来自一个传感器的图像。 为此,我在主UI上使用BeginInvoke private void cameraCtrller_ImageProcessed(object sender, ImageProcessedEventArgs e) { if (myDisplay.InvokeRequired) { myDisplay.BeginInvoke( new EventHandler<ImageProcess

我正在开发一个应用程序,显示来自一个传感器的图像。 为此,我在主UI上使用BeginInvoke

private void cameraCtrller_ImageProcessed(object sender, ImageProcessedEventArgs e)
{
    if (myDisplay.InvokeRequired)
    {
        myDisplay.BeginInvoke(
            new EventHandler<ImageProcessedEventArgs>(cameraCtrller_ImageProcessed),
            sender,
            e
        );
    }
    else
    {
        myDisplay.DrawImage(e.Image);
    }
}
private void cameraCtrller\u ImageProcessed(对象发送方,ImageProcessedEventArgs e)
{
if(myDisplay.invokererequired)
{
myDisplay.BeginInvoke(
新事件处理程序(cameraCtrller_ImageProcessed),
发件人,
E
);
}
其他的
{
myDisplay.DrawImage(e.Image);
}
}
问题是图像的速度很快,用户界面在一段时间后(偶尔)会变得无响应。传感器总是比用户界面快

当UI没有响应时,如果我在开始时设置断点,它会中断,但它永远不会到达DrawImage

有了这个,我尝试执行
Application.DoEvents()
在BeginInvoke中断后,它开始到达DrawImage,但在收到的每个图像上都保留此选项并不是一个好的解决方案


有没有办法解决这个问题?是否有可能放弃UI无法显示的图像?

您是否尝试过直接使用
调用(…)
?BeginInvoke不会直接执行(据我所知),但可以延迟。通过这种方式,您可能会得到重叠的绘图尝试。这可能是因为您溢出了Windows消息队列(默认情况下,该队列限制为10000项)。如果发生这种情况,
BeginInvoke()
将无法在队列中发布其消息,因此不会产生任何效果。不要在每次调用事件本身时创建事件处理程序。尝试
this.BeginInvoke(新操作(()=>myDisplay.DrawImage(e.Image));
,删除所有其他内容。如果您正在设置PictureBox.Image或使用位图,请在每次分配/绘制另一幅图像或位图之前,都处理掉上一幅图像或位图。@MongZhu我已调用,但决定改为BeginInvoke,这两幅图像上都出现了问题。请注意,在WinForms中,不可能生成大于30~32 fp的帧速率s