Ist async / in MVVM unbrauchbar? [geschlossen]

7

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.

    
kasperhj 09.11.2012, 08:00
quelle

1 Antwort

28

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:

%Vor%

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.

    
Stephen Cleary 09.11.2012, 15:05
quelle

Tags und Links