Lösen der Cross-Thread-Ausnahme beim Aktualisieren einer TextBox über einen seriellen Port in C#
Ein häufiges Problem bei der seriellen C#-Kommunikation besteht darin, eine TextBox über den serialPort1_DataReceived
-Ereignishandler zu aktualisieren. Da der serielle Port in einem separaten Thread ausgeführt wird, wird beim direkten Zugriff auf die TextBox über diesen Ereignishandler die Ausnahme „Cross-Thread-Vorgang nicht gültig“ ausgelöst.
Die Lösung erfordert eine Thread-sichere Methode, um den Text der TextBox zu aktualisieren. Dies wird erreicht, indem das Update zurück an den UI-Thread gemarshallt wird. So geht's:
<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>
Diese SetText
-Methode prüft, ob der aktuelle Thread der UI-Thread ist (textBox1.InvokeRequired
). Wenn nicht, verwendet es Invoke
, um den SetText
-Aufruf zurück an den UI-Thread zu leiten und so die Thread-Sicherheit zu gewährleisten. Andernfalls wird die TextBox direkt aktualisiert.
So integrieren Sie dies in Ihren serialPort1_DataReceived
Ereignishandler:
<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { string receivedData = serialPort1.ReadExisting(); SetText(receivedData); // Use the thread-safe SetText method }</code>
Dieser überarbeitete Ereignishandler liest Daten von der seriellen Schnittstelle und verwendet die Methode SetText
, um die TextBox sicher zu aktualisieren und so die Thread-übergreifende Ausnahme zu verhindern. Dieser Ansatz garantiert, dass UI-Updates immer im richtigen Thread durchgeführt werden, wodurch die Anwendungsstabilität gewahrt bleibt.
Das obige ist der detaillierte Inhalt vonWie aktualisiere ich eine TextBox sicher über einen seriellen Port in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!