2009-08-21 1 views
0

Ich kenne das Dispatcher-Objekt des Steuerelements, aber das löst mein Problem in einem MVVM-Szenario nicht.In WPF MVVM, wie eine Hintergrundaufgabe erstellt wird, die einen Rückruf auf dem UI-Thread ausführt?

Ich habe einen UI-Befehl, der eine Methode auf meiner VM aufruft, die einen Thread erzeugt und dann zurückkehrt, wenn der Thread fertig ist (Hintergrundarbeiter könnte dafür gut sein?), Wird es einen Callback auslösen, aber Der Trick besteht darin, dass Callback eine beobachtbare Sammlung ändert. Wie kann ich diesen Callback im UI-Thread auslösen?

Antwort

3

Verwenden Sie die , die dem UI-Thread zugeordnet ist. Normalerweise hätten Sie eine base ViewModel class, die die für alle Unterklassen verfügbar macht. Dann würde Ihre VM so etwas wie:

Dispatcher.Invoke((ThreadStart) delegate 
{ 
    //this code executes on the UI thread 
}); 
1

Wenn sich die Callback-Methode in einem Formular oder einer Steuerung mit Zugriff auf den Dispatcher befindet, können Sie CheckAccess() aufrufen. Wenn Sie im selben Thread sind, dann machen Sie einfach die Arbeit. Verwenden Sie andernfalls den Dispatcher, um einen Delegaten an die ausführende Funktion zu senden, die sich dann im richtigen Thread befindet.

1

Ein Hintergrundarbeiter wird gut dafür arbeiten.

Um Ihre Änderungen im UI-Thread zu veröffentlichen, müssen Sie nur Ihre Callback-Bindung in Ihren Dispatcher setzen und dispatcher.Invoke verwenden, um die beobachtbare Sammlung tatsächlich zu ändern.

Deshalb ist es fast immer sehr praktisch, Ihre ViewModel-Klasse einen Verweis auf den Dispatcher beizubehalten. Dies macht dieses Muster sehr einfach zu implementieren.

0

A BackgroundWorker wäre dies perfekt sein, weil es die RunWorkerCompleted Ereignis auf dem entsprechenden Thread wirft, auf der Grundlage der SynchronizationContext (die in WPF, auf dem aktuellen Dispatcher abhängt) .

Eine weitere Option ist, den aktuellen Dispatcher (Dispatcher.CurrentDispatcher) zu speichern, bevor Sie den asynchronen Vorgang ausführen, damit Sie ihn verwenden können, um Ihren Rückruf aufzurufen.

ich eine Klasse schrieb, diese Art von Problem für beobachtbare Sammlungen zu handhaben, können Sie finden es here