InvalidOperationException - obiekt jest obecnie używany w innym miejscu - czerwony krzyżyk
Mam aplikację komputerową C #, w której jeden tworzony przeze mnie wątek nieustannie pobiera obraz ze źródła (w rzeczywistości jest to aparat cyfrowy) i umieszcza go na panelu (panel.Image = img) w GUI (co musi być kolejnym wątkiem jako to kod kryjący kontrolkę.
Aplikacja działa, ale na niektórych komputerach otrzymuję następujący błąd w losowych odstępach czasu (nieprzewidywalne)
************** Exception Text **************
System.InvalidOperationException: The object is currently in use elsewhere.
Następnie panel zmienia się w czerwony krzyżyk, czerwony X - myślę, że jest to ikona nieprawidłowego obrazu, którą można edytować z właściwości. Aplikacja działa, ale panel nigdy nie jest aktualizowany.
Z tego, co mogę powiedzieć, ten błąd pochodzi z zdarzenia onpaint kontroli, w którym rysuję coś innego na obrazie.
Próbowałem użyć tam blokady, ale nie miałem szczęścia :(
Sposób, w jaki nazywam funkcję, która umieszcza obraz na panelu, jest następujący:
if (this.ReceivedFrame != null)
{
Delegate[] clients = this.ReceivedFrame.GetInvocationList();
foreach (Delegate del in clients)
{
try
{
del.DynamicInvoke(new object[] { this,
new StreamEventArgs(frame)} );
}
catch { }
}
}
to jest delegat:
public delegate void ReceivedFrameEventHandler(object sender, StreamEventArgs e);
public event ReceivedFrameEventHandler ReceivedFrame;
i tak rejestruje się w nim funkcja wewnątrz kodu sterującego:
Camera.ReceivedFrame +=
new Camera.ReceivedFrameEventHandler(camera_ReceivedFrame);
Próbowałem też
del.Method.Invoke(del.Target, new object[] { this, new StreamEventArgs(b) });
zamiast
del.DynamicInvoke(new object[] { this, new StreamEventArgs(frame) });
ale nie ma szczęścia
Czy ktoś wie, jak mogę naprawić ten błąd lub przynajmniej złapać błąd i sprawić, że wątek po raz kolejny umieści obrazy na panelu?