Heim >Backend-Entwicklung >C++ >Wie kann der Fehler „Cross-Thread-Vorgang nicht gültig' beim C#-Multithreading behoben werden?
Behandlung der Ausnahme „Cross-Thread-Vorgang nicht gültig“ in C#-Multithread-Anwendungen
In C#-Anwendungen, die mehrere Threads verwenden, ist es wichtig sicherzustellen, dass auf UI-Elemente ausschließlich der Thread zugreift, der für ihre Erstellung verantwortlich ist. Ein Verstoß gegen diesen Grundsatz führt zur gefürchteten Ausnahme „Cross-Thread-Vorgang nicht gültig“.
Grundlegendes zum C#-Threading und zum Besitz von UI-Elementen
C# ermöglicht die gleichzeitige Ausführung über mehrere Threads. Jeder Thread arbeitet unabhängig in seinem eigenen Kontext. Entscheidend ist, dass UI-Elemente (wie Textfelder) zu einem bestimmten Thread gehören, typischerweise dem Haupt-UI-Thread.
Das Problem: Zugriff auf UI-Elemente aus nicht autorisierten Threads
Der Fehler tritt auf, wenn ein anderer Thread als der besitzende Thread versucht, die Eigenschaften eines UI-Elements zu ändern. Dies ist ein häufiges Szenario, das häufig bei der Verarbeitung von Ereignissen aus Hintergrundthreads (z. B. Datenempfang über serielle Schnittstelle) auftritt.
Die Lösung: Dispatcher-Aufruf implementieren
Die Lösung besteht darin, einen Dispatcher zu verwenden, um Vorgänge auf den richtigen Thread zu verteilen. Dies garantiert threadsichere Änderungen von UI-Steuerelementen.
Code-Implementierung
So implementieren Sie diese Lösung:
Definieren Sie zunächst einen Delegaten:
<code class="language-csharp">private delegate void SetTextCallback(string text);</code>
Als nächstes erstellen Sie eine Methode, um das Textfeld sicher zu aktualisieren:
<code class="language-csharp">private void SetText(string text) { if (this.textBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.textBox1.Text = text; } }</code>
Zum Schluss rufen Sie in Ihrem Event-Handler für empfangene serielle Portdaten die SetText
-Methode auf:
<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { txt += serialPort1.ReadExisting(); SetText(txt); }</code>
Dieser Ansatz stellt sicher, dass die Eigenschaft textBox1.Text
sicher aktualisiert wird, und verhindert so die Ausnahme „Cross-Thread-Vorgang ungültig“. Die InvokeRequired
Prüfung ermittelt effizient, ob ein Disponentenruf notwendig ist.
Das obige ist der detaillierte Inhalt vonWie kann der Fehler „Cross-Thread-Vorgang nicht gültig' beim C#-Multithreading behoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!