C#-Cross-Thread-Vorgangsüberprüfung: Zugriff auf Steuerelemente von Nicht-UI-Threads
Beim Zugriff auf UI-Elemente (z. B. TextBox) in einem anderen Thread als dem Thread, der das Steuerelement erstellt hat, kann die Ausnahme auftreten: „Ungültiger Thread-übergreifender Vorgang: Zugriff auf das Steuerelement ‚textBox1‘ von einem anderen Thread als dem Thread, der das Steuerelement erstellt hat.“ habe es geschaffen“. Dies liegt daran, dass jedes UI-Element einem bestimmten Thread zur Verarbeitung von Ereignissen und Änderungen zugeordnet ist.
In diesem Beispiel versuchen Sie, das serialport1_DataReceived
-Steuerelement vom textBox1
-Ereignishandler zu aktualisieren, der aufgrund der asynchronen Natur der seriellen Portoperationen in einem separaten Thread ausgeführt wird.
Lösung:
Um dieses Problem zu beheben und von einem Nicht-UI-Thread aus sicher auf das textBox1
-Steuerelement zuzugreifen, müssen Sie sicherstellen, dass alle Interaktionen mit UI-Elementen im Hauptthread (UI-Thread) aufgerufen werden. Dies kann mithilfe eines Schedulers erreicht werden, der einen Thread-übergreifenden Kommunikationsmechanismus bereitstellt und sicherstellt, dass UI-Updates im richtigen Thread durchgeführt werden.
Das Folgende ist eine modifizierte Version der textBox1
-Methode, die die delegierte Sicherheitsupdate-serialport1_DataReceived
-Steuerung verwendet:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { // 在UI线程上更新'txt'变量 txt += serialPort1.ReadExisting().ToString(); // 使用委托在UI线程上访问'textBox1'控件 SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { txt.ToString() }); } private delegate void SetTextCallback(string text); private void SetText(string text) { // 检查'textBox1'控件是否在不同的线程上创建 if (this.textBox1.InvokeRequired) { this.Invoke(d, new object[] { text }); } else { // 如果在UI线程上创建,则直接更新'textBox1'控件 this.textBox1.Text = text; } }
Mit diesem Ansatz stellen Sie sicher, dass textBox1
auf Steuerelemente immer im Hauptthread (UI-Thread) zugegriffen und diese geändert werden, wodurch Thread-übergreifende Betriebsausnahmen behoben werden.
Das obige ist der detaillierte Inhalt vonWie aktualisiere ich UI-Steuerelemente sicher von Nicht-UI-Threads in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!