Jetzt weiß ich, Eigenschaften unterstützen nicht async/erwarten aus guten Gründen. Aber manchmal müssen Sie eine zusätzliche Hintergrundverarbeitung von einem Property Setter starten - ein gutes Beispiel ist die Datenbindung in einem MVVM-Szenario.Korrekte Methode zum Aufrufen von asynchronen Methoden innerhalb eines datengebundenen Eigenschaftensetzers?
In meinem Fall habe ich eine Eigenschaft, die an das SelectedItem einer ListView gebunden ist. Natürlich setze ich den neuen Wert sofort auf das Hintergrundfeld und die Hauptarbeit der Eigenschaft ist erledigt. Die Änderung des ausgewählten Elements in der Benutzeroberfläche muss jedoch auch einen REST-Serviceaufruf auslösen, um basierend auf dem jetzt ausgewählten Element neue Daten zu erhalten.
Also muss ich eine asynchrone Methode aufrufen. Ich kann es natürlich nicht abwarten, aber ich möchte auch nicht den Anruf abbrechen und vergessen, da ich während der asynchronen Verarbeitung Ausnahmen übersehen konnte.
Nun mein nehmen ist folgende:
private Feed selectedFeed;
public Feed SelectedFeed
{
get
{
return this.selectedFeed;
}
set
{
if (this.selectedFeed != value)
{
this.selectedFeed = value;
RaisePropertyChanged();
Task task = GetFeedArticles(value.Id);
task.ContinueWith(t =>
{
if (t.Status != TaskStatus.RanToCompletion)
{
MessengerInstance.Send<string>("Error description", "DisplayErrorNotification");
}
});
}
}
}
Ok so neben der Tatsache, dass ich den Umgang mit der Setter auf eine synchrone Methode bewegen konnte, ist dies der richtige Weg, ein solches Szenario zu behandeln? Gibt es eine bessere, weniger überladene Lösung, die ich nicht sehe?
Wäre sehr daran interessiert, einige andere Ansichten zu diesem Problem zu sehen. Ich bin ein bisschen neugierig, dass ich zu diesem konkreten Thema keine weiteren Diskussionen finden konnte, da es mir sehr häufig in MVVM-Apps vorkommt, die Databinding stark nutzen.
Spaß Sache von hier vorsichtig sein, wenn Änderungen Ihrer Immobilie Handhabung während eine Anfrage REST im Gange ist. Vor allem, weil Sie nicht garantieren können, dass sie in der Reihenfolge ausgeführt werden, in der sie aufgerufen wurden. –
Ja, das stimmt :), aber dieses Problem würde auftreten, egal ob ich einen Property-Setter verwende, um den REST-Aufruf oder ein Event oder irgendetwas anderes zu initiieren. Mein Take ist, alle noch laufenden Anfragen abzubrechen, wenn sich das ausgewählte Element ändert, bevor ein neues gesendet wird. –
Sie könnten stattdessen einen Befehl an das Ereignis "selection changed" anhängen, anstatt zu überprüfen, ob das ausgewählte Element von der Benutzeroberfläche geändert wurde. –