【发布时间】:2010-11-06 19:30:36
【问题描述】:
我有一个 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) });
但没有运气
有谁知道我可以如何修复这个错误,或者至少以某种方式捕获错误并让线程再次将图像放在面板上?
【问题讨论】:
标签: c# winforms multithreading gdi+ invalidoperationexception