Heim >Backend-Entwicklung >C++ >Warum wirft mein C# -Hintergrund -Thread 'Der aufrufende Thread kann auf dieses Objekt nicht zugreifen'.
C# Hintergrund-Thread-Ausnahme: "Cross-Thread-Operation nicht gültig: Steuerung '...' Zugriff aus einem anderen Thread als dem Thread, auf dem er erstellt wurde."
Dieser Artikel befasst sich mit einem gemeinsamen C# -Fehler, der bei der Arbeit mit Hintergrund -Threads und UI -Elementen auftritt: "Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da ein anderer Thread ihn besitzt." Dies geschieht, weil UI -Elemente normalerweise im Haupt -UI -Thread erstellt und gehalten werden. Der Versuch, sie aus einem Hintergrund -Thread zu ändern, verstößt gegen die Gewinne.
Das Problem:
Die Ausnahme entsteht, wenn ein Hintergrund -Thread versucht, auf ein UI -Element (wie ein Textfeld oder eine andere Steuerung) auf dem Haupt -Thread zuzugreifen oder zu ändern. WPF und andere UI -Frameworks erzwingen diese Einschränkung, um Rassenbedingungen und Datenversorgung zu verhindern.
Die Lösung: Verwenden Sie Dispatcher.Invoke
Die Lösung beinhaltet das Marsching des UI -Updates mit der Dispatcher.Invoke
-Methode zum Haupt -Thread. Dispatcher.Invoke
stellt sicher
Beispielcode -Änderung:
Nehmen wir an, Sie haben eine Methode, die auf einem Hintergrund -Thread ausgeführt wird, der ein Textfeld mit dem Namen GetGridData
: txtSearchCountry
aktualisieren muss
Original (problematischer) Code:
<code class="language-csharp">private void GetGridData(object sender, int pageIndex) { // ... other code ... objUDMCountryStandards.Country = txtSearchCountry.Text.Trim() != string.Empty ? txtSearchCountry.Text : null; // ... more code ... }</code>
korrigierten Code mit : Dispatcher.Invoke
<code class="language-csharp">private void GetGridData(object sender, int pageIndex) { // ... other code ... this.Dispatcher.Invoke(() => { objUDMCountryStandards.Country = txtSearchCountry.Text.Trim() != string.Empty ? txtSearchCountry.Text : null; }); // ... more code ... }</code>Die
-Methode nimmt einen Delegierten (in diesem Fall eine anonyme Funktion) als Argument an. Dieser Delegierte enthält den Code, der im UI -Thread ausgeführt werden muss. Dispatcher.Invoke
blockiert, bis der Delegierte die Ausführung im UI -Thread abschließt. Dies garantiert die Sicherheit von Faden. Dispatcher.Invoke
wird die Zuordnung zu Dispatcher.Invoke
jetzt sicher am Haupt UI -Thread durchgeführt, wodurch die Ausnahme verhindert wird. Denken Sie daran, dieses Muster auf alle Modifikationen des UI -Elements anzuwenden, die aus Hintergrund -Threads durchgeführt werden. objUDMCountryStandards.Country
Das obige ist der detaillierte Inhalt vonWarum wirft mein C# -Hintergrund -Thread 'Der aufrufende Thread kann auf dieses Objekt nicht zugreifen'.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!