У меня есть настольное приложение C#, в котором один поток, который я создаю, непрерывно получает изображение из источника (это фактически цифровая камера) и помещает его на панель (панель. изображение = IMG) в GUI (который должен быть другой поток, как это отделенного кода элемента управления.InvalidOperationException - объект в настоящее время используется в другом месте - красный крест
приложение работает, но на некоторых машинах, которые я получаю следующее сообщение об ошибке в случайные промежутки времени (непредсказуемый)
************** 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) });
, но не повезло
Кто-нибудь знает, как я могу исправить эту ошибку, или, по крайней мере поймать ошибку как-то и сделать нить снова поместите изображения на панель?
Я обновляю панель в основном потоке, но я вызываю функцию, которая обновляет ее из другого потока и передает изображение в качестве параметра. – 2009-06-29 20:39:53
, если вы вызываете функцию, которая обновляет панель из другого потока, а в самой функции отсутствует переключение контекста (например, переключиться на основной поток, используя вызов), это означает, что ваше обновление выполнено на другом потоке, а не на главном потоке –