In MVVM, wo die ViewModels die Aufrufe über INotifyPropertyChanged-Ereignisse aktualisieren, scheint nicht viel Platz für die coole Funktion von async / await zu sein; Ausführen der Fortsetzung auf dem erfassten Synchronisationskontext des Aufrufers.
Wenn das der Fall ist, wer nutzt dann tatsächlich die Funktionen von async / erwarten Sie in einer modernen UI-basierten App? In diesem Zusammenhang kann "wer" auch bedeuten, welches Muster, z. MVC-Variante.
Ich kann folgendes als eine gute Art der Verwendung von TAP
betrachten %Vor%, aber dies auf dem erfassten SyncContext ausgeführt wird, hilft nicht wirklich viel. Eigentlich könnten wir das alles stattdessen in das Modell einbauen.
%Vor%und jetzt möchten wir wirklich, dass der syncContext NICHT der eingefangene ist.
Wenn INotifyPropertyChanged.PropertyChanged
im UI-Synchronisierungskontext ausgelöst wurde, ist erforderlich für die Datenbindung.
async
/ await
zwingt Sie dazu, zwischen Eigenschaften (die den aktuellen Zustand darstellen und immer synchron sind) und Befehlen (die Aktionen darstellen) zu unterscheiden und kann synchron oder asynchron sein). Property Getter und Setter können nicht sein async
, daher ist Ihr Beispielcode mit einem "async set" kein möglicher Ansatz.
async
aktiviert asynchrone Befehle. Sie können die Befehlsbindung verwenden, um geroutete Befehle asynchron zu verarbeiten, oder einen async
-Delegaten an eine DelegateCommand
übergeben oder Ihre eigene ICommand
-Implementierung verwenden. Wie auch immer Sie es machen, am Ende erhalten Sie einen async void
-Befehls-Event-Handler.
Ein realistisches Beispiel ist, dass die VM-Eigenschaften die M-Eigenschaften im Speicher festlegen und ein SaveCommand
mit einem async
-Handler haben. Es ist üblich, dass async
Handler mit einer zusätzlichen VM-Eigenschaft ( SaveInProgress
oder möglicherweise eine gemeinsame Busy
mit anderen async
Handlern) interagieren, damit die Benutzeroberfläche angemessen reagieren kann, wenn der Befehl ausgeführt wird (normalerweise mindestens verursacht CanExecute
, um false
) zurückzugeben.
Also sieht Ihr async
-Handler so aus:
Beachten Sie, dass die VM-Eigenschaften ( Error
und Busy
) im erfassten UI-Synchronisationskontext aktualisiert werden.
Dies veranschaulicht das zentrale Konzept von async
MVVM: Befehle können async
sein, aber die Eigenschaften (z. B. Busy
) repräsentieren immer den aktuellen Status.
Wenn Sie async
zu einer vorhandenen MVVM-App hinzufügen, verfügen Sie über mehrere zusätzliche Eigenschaften, die Geschäftsinformationen und möglicherweise auch Fortschrittsupdates anzeigen (z. B. Prozent abgeschlossen). Abhängig von Ihrer Anwendung können Sie mehrere asynchrone Vorgänge gleichzeitig zulassen. Sie müssen sich überlegen, wie Sie diese Informationen zu Ihren Ansichten hinzufügen können. Ich finde, dass dies der schwierigste Teil von async
MVVM-Apps ist.