我有一个 C# 桌面应用程序,其中我创建的一个线程不断从源获取图像(实际上是数码相机)并将其放在 GUI 中的面板(panel.Image = 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) });
但没有运气
有谁知道我该如何解决这个错误,或者至少以某种方式捕获错误并让线程再次将图像放在面板上?