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