gpt4 book ai didi

c# - InvalidOperationException - 对象当前正在别处使用 - 红十字

转载 作者:IT王子 更新时间:2023-10-29 04:11:29 25 4
gpt4 key购买 nike

我有一个 C# 桌面应用程序,其中我创建的一个线程不断从源(实际上是数码相机)获取图像并将其放在 GUI 中的面板(面板。图像= img)上(必须是另一个线程,因为它是控件的代码隐藏。

该应用程序可以运行,但在某些机器上我会在随机时间间隔(不可预测)收到以下错误

************** Exception Text **************
System.InvalidOperationException: The object is currently in use elsewhere.

然后面板变成一个红叉,红 X - 我认为这是可从属性编辑的无效图片图标。应用程序继续工作,但面板永远不会更新。

据我所知,此错误来自控件的 onpaint 事件,我在该事件中在图片上绘制了其他内容。

我尝试在那里使用锁,但没有成功 :(

我调用将图像放在面板上的函数的方式如下:

if (this.ReceivedFrame != null)
{
Delegate[] clients = this.ReceivedFrame.GetInvocationList();
foreach (Delegate del in clients)
{
try
{
del.DynamicInvoke(new object[] { this,
new StreamEventArgs(frame)} );
}
catch { }
}
}

这是代表:

public delegate void ReceivedFrameEventHandler(object sender, StreamEventArgs e);
public event ReceivedFrameEventHandler ReceivedFrame;

这就是控制代码隐藏中的函数如何注册到它:

Camera.ReceivedFrame += 
new Camera.ReceivedFrameEventHandler(camera_ReceivedFrame);

我也试过

del.Method.Invoke(del.Target, new object[] { this, new StreamEventArgs(b) });

代替

del.DynamicInvoke(new object[] { this, new StreamEventArgs(frame) });

但没有运气

有谁知道我如何修复这个错误或者至少以某种方式捕获错误并让线程再次将图像放在面板上?

最佳答案

这是因为 Gdi+ Image 类不是线程安全的。但是,每次需要访问图像时都可以通过使用锁来避免 InvalidOperationException,例如绘画或获取图像大小:

Image DummyImage;

// Paint
lock (DummyImage)
e.Graphics.DrawImage(DummyImage, 10, 10);

// Access Image properties
Size ImageSize;
lock (DummyImage)
ImageSize = DummyImage.Size;

顺便说一句,如果您将使用上述模式,则不需要调用。

关于c# - InvalidOperationException - 对象当前正在别处使用 - 红十字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1060280/

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