Heim  >  Artikel  >  Backend-Entwicklung  >  Wie 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?

Wie 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?

DDD
DDDOriginal
2024-10-30 15:20:51450Durchsuche

How Can I Modify an ObservableCollection from a Different Thread in a WPF Application Without a Dispatcher Thread Affinity Violation?

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);
        });
    }
}
Dieser geänderte Code stellt sicher, dass alle Änderungen an _matchObsCollection an den UI-Thread delegiert werden, wodurch die Ausnahme behoben wird.

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!

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