2 Stimmen

Probleme mit Dispatcher.Invoke und Thread-Zugriff

Ich habe versucht, Threads in C# zu behandeln, aber ich habe in einer wierd Ausnahme aufgetreten, die ich nicht weiß, wie zu beheben. Ich habe eine Methode, die von BackgroundWorker läuft, in dem es dieses Stück Code:

GridView gridView;
DataView dataView;

queryTable.GetViewAndDataView(out gridView, out dataView);

this.listView.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(
    delegate() {
        listViewView = gridView;                    
        listView.ItemsSource = dataView;
    }
));

GetViewAndDataView füllt eine GridView und eine DataView, während der Delegate-Code die aktuelle ListView setzt. Die Verwendung von Invoke soll keine Ausnahmen auslösen, aber wenn ich versuche, es auszuführen, erhalte ich dies: Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da es einem anderen Thread gehört .

Weiß jemand, wie eine solche Ausnahme zu behandeln, oder zumindest, wie man den Thread Objekt besitzen deaktivieren?

5voto

Polity Punkte 14284

Die Meldung ist korrekt, Sie können die Steuerelemente nicht in einem Hintergrund-Thread erstellen und sie in Ihrem UI-Thread verwenden. Sie müssen sie sowohl auf Ihrem UI-Thread erstellen als auch zuweisen. Ich empfehle, die Daten zuerst im Hintergrund-Thread zu laden und dann den Rest der Arbeit im UI-Thread zu erledigen

2voto

TcKs Punkte 24671

Sie müssen speichern this.listView.Dispatcher auf eine lokale Variable, bevor Sie den parallelen Thread starten. Im Thred müssen Sie den Dispatcher dieser Variablen verwenden.

Allerdings @Polity hat Recht - müssen Sie Steuerelemente/Elemente im UI-Thread erstellen. In parallelen Threads können Sie nur Nicht-UI-Objekte erstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X