Heim >Backend-Entwicklung >C++ >Wie kann der Fehler „Cross-Thread-Vorgang nicht gültig' beim C#-Multithreading behoben werden?

Wie kann der Fehler „Cross-Thread-Vorgang nicht gültig' beim C#-Multithreading behoben werden?

Linda Hamilton
Linda HamiltonOriginal
2025-01-23 02:25:10516Durchsuche

How to Solve the

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 InvokeRequiredPrü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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn