Dispatcher-Thread-Affinitätsverletzung mit ObservableCollection-Änderung
In einer WPF-Anwendung müssen bestimmte Arten von Sammlungen, einschließlich DataGrid, vom Dispatcher aus geändert werden Faden. Dies liegt daran, dass diese Sammlungen eine Affinität zum UI-Thread beibehalten und der Versuch, sie von einem anderen Thread aus zu ändern, zu Ausnahmen wie „Diese Art von CollectionView unterstützt keine Änderungen an seiner SourceCollection von einem Thread, der sich vom Dispatcher-Thread unterscheidet.“
Im bereitgestellten Code wird die ObservableCollection _matchObsCollection im MainWindowViewModel im UI-Thread erstellt. Die Load()-Methode, die diese Sammlung ändert, wird jedoch asynchron aufgerufen. Dies verursacht die Ausnahme, weil die Änderung von einem anderen Thread als dem UI-Thread aus versucht wird.Lösung:
Um das Problem zu beheben, müssen alle Änderungen an _matchObsCollection durchgeführt werden im Dispatcher-Thread. Dies kann erreicht werden, indem die Dispatcher.Invoke()-Methode verwendet wird, um die Änderungen an den UI-Thread zu delegieren.Hier ist eine modifizierte Version der Load()-Methode, die Dispatcher.Invoke() verwendet, um die ObservableCollection zu ändern im UI-Thread:public void Load() { matchList = new List<GetMatchDetailsDC>(); matchList = proxy.GetMatch().ToList(); foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList) { App.Current.Dispatcher.Invoke((Action)delegate { _matchObsCollection.Add(match); }); } }
Das obige ist der detaillierte Inhalt vonWie kann ich eine ObservableCollection aus einem anderen Thread in einer WPF-Anwendung ändern, ohne dass es zu einer Verletzung der Dispatcher-Thread-Affinität kommt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!