Threadübergreifende Fehler vermeiden: UI-Elemente aus Nicht-UI-Threads sicher aktualisieren
Bei der Interaktion mit UI-Elementen aus einem Nicht-UI-Thread (z. B. dem Thread, der durch ein Datenempfangsereignis über eine serielle Schnittstelle erzeugt wurde) müssen Thread-Sicherheitsprobleme behandelt werden, um Thread-übergreifende Fehler zu vermeiden.
Im C#-Code tritt der Fehler „Ungültiger Thread-übergreifender Vorgang: Zugriff auf das Steuerelement ‚textBox1‘ von einem anderen Thread als dem Thread, der das Steuerelement ‚textBox1‘ erstellt hat“ auf, weil der UI-Thread Eigentümer des Steuerelements „textBox1“ ist und von einem anderen darauf zugreift Thread führt zu Thread-Affinitätskonflikten.
Um dieses Problem zu lösen, muss ein Scheduler verwendet werden, der es dem entsprechenden Thread (normalerweise dem UI-Thread) ermöglicht, auf die UI-Elemente zuzugreifen. In diesem Fall können Delegaten und die Invoke-Methode verwendet werden, um einen threadsicheren Zugriff sicherzustellen:
<code class="language-csharp">delegate void SetTextCallback(string text); 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>
Jetzt im Ereignishandler serialPort1_DataReceived:
<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { txt += serialPort1.ReadExisting().ToString(); SetText(txt.ToString()); }</code>
Durch die Verwendung der SetText-Methode können Sie die Aufgabe, die Texteigenschaft von textBox1 zu aktualisieren, an den UI-Thread delegieren und so einen sicheren und fehlerfreien Zugriff auf UI-Elemente von Nicht-UI-Threads gewährleisten.
Das obige ist der detaillierte Inhalt vonWie aktualisiere ich UI-Elemente aus Nicht-UI-Threads in C# sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!