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?

questionAnswers(4)

yourAnswerToTheQuestion