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
Mary-Kate OlsenOriginal
2025-01-23 02:27:10942Durchsuche

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:

<code class="language-csharp">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;
  }
}</code>

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!

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