Heim > Backend-Entwicklung > C++ > Wie aktualisiere ich UI-Steuerelemente sicher von Nicht-UI-Threads in C#?

Wie aktualisiere ich UI-Steuerelemente sicher von Nicht-UI-Threads in C#?

Mary-Kate Olsen
Freigeben: 2025-01-23 02:27:10
Original
943 Leute haben es durchsucht

How to Safely Update UI Controls from Non-UI Threads in C#?

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;
  }
}
Nach dem Login kopieren

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!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage