Löse eine Cross-Threading-Ausnahme in WinForms

8

Zur Zeit arbeite ich mit WinForms (in C #) und ich muss die Anwendung im Hintergrund ausführen. Zu diesem Zweck verwende ich asynchron. Wenn ich die Anwendung starte, wird eine Ausnahme wie

angezeigt
  

"Kreuzthread-Operation nicht gültig: Steuerung '', auf die von einem anderen Thread als dem Thread, auf dem sie erstellt wurde, zugegriffen wird."

Wie kann ich diesen Fehler beheben?

    
Victor 03.05.2011, 11:30
quelle

6 Antworten

9

Wenn Sie bei Methodenaufrufen an ein Steuerelement einen anderen Thread aufrufen als den, an dem das Steuerelement erstellt wurde, müssen Sie einen Aufruf mit Steuerung.Invozieren . Hier ist ein Codebeispiel:

%Vor%

Ich hoffe, es hilft.

    
Daniel Peñalba 03.05.2011, 11:32
quelle
3

Meistens ist der beste Weg, um mit WinForms so etwas zu machen, BackgroundWorker , die Ihre Arbeit an einem Hintergrundthread ausführen, Ihnen aber eine saubere Möglichkeit bieten, den Status an die Benutzeroberfläche zurückzumelden.

In vielen alltäglichen .NET-Programmen ist das explizite Erstellen von Threads oder das Aufrufen von .Invoke ein Zeichen dafür, dass Sie das Framework nicht zu seinem vollen Vorteil nutzen (natürlich gibt es viele legitime Gründe, Low-Level-Kram zu machen) Es ist auch nur so, dass sie weniger häufig sind, als Menschen manchmal erkennen.)

    
Will Dean 03.05.2011 11:34
quelle
2

Sie müssen prüfen, ob Invoke für das Steuerelement erforderlich ist, das Sie aktualisieren möchten. Etwas wie das:

%Vor%     
AlexCuse 03.05.2011 11:34
quelle
1

Ein Muster, das Sie möglicherweise nützlich finden, ist eine Überprüfung an der Spitze der Funktionen, die mit der GUI interagieren, um zu sehen, ob Sie auf dem richtigen Thread laufen oder nicht und die Funktion selbst aufrufen, falls erforderlich. So:

%Vor%

Verwendung dieses Musters - Wenn Sie beim Aufruf der Methode im richtigen Thread sind, ruft es sich nicht selbst auf, aber wenn Sie sich in einem anderen Thread befinden, ruft es sich selbst auf und kehrt dann zurück (die GUI-Manipulationslogik ist also immer) einmal aufgerufen wie auch immer).

    
Russell Troywest 03.05.2011 11:50
quelle
0

Von Invoke aktualisiert, um mit Invoke

zu beginnen %Vor%     
Pankaj 03.05.2011 12:48
quelle
0

Die UI-Änderungen können mit Control.Invoke () -Methoden durchgeführt werden, diese Cross-Thread-Ausnahme kann mit dem folgenden Code-Snippet gelöst werden.

%Vor%     
Amal 10.05.2016 06:32
quelle

Tags und Links