У меня есть настольное приложение С#, в котором один поток, который я создаю, постоянно получает изображение из источника (фактически это цифровая камера) и помещает его в панель (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) });
но не повезло
Кто-нибудь знает, как я могу исправить эту ошибку или, по крайней мере, поймать ошибку так или иначе, чтобы поток снова помещал изображения на панель?