Okay, es klingt seltsam, aber der Code ist sehr einfach und erklärt die Situation gut.
public virtual async Task RemoveFromRoleAsync(AzureTableUser user, string role)
{
AssertNotDisposed();
var roles = await GetRolesForUser(user);
roles.Roles = RemoveRoles(roles.Roles, role);
await Run(TableOperation.Replace(roles));
}
(Ich weiß, dass ich in der folgenden Zusammenfassung spreche, aber das Obige ist eine tatsächliche Methode aus dem tatsächlichen Produktionscode, die tatsächlich das tut, worüber ich hier frage, und ich bin tatsächlich daran interessiert, dass Sie sie tatsächlich überprüfen es für die Richtigkeit gegenüber dem Async / Wait-Muster.)
Ich begegne diesem Muster jetzt, wo ich async
/ await
more benutze, immer öfter. Das Muster besteht aus der folgenden Ereigniskette:
- Warten Sie auf einen ersten Anruf, der mir einige Informationen liefert, an denen ich arbeiten muss
- Arbeiten Sie synchron an diesen Informationen
- Warten Sie auf einen letzten Anruf, der die aktualisierte Arbeit speichert
Der obige Codeblock beschreibt normalerweise, wie ich mit diesen Methoden umgehe. Ich habe await
den ersten Anruf, den ich machen muss, weil er asynchron ist. Als Nächstes erledige ich die Arbeit, die ich ausführen muss, die nicht an E / A oder Ressourcen gebunden ist und daher nicht asynchron ist. Schließlich speichere ich meine Arbeit, die auch ein async
Aufruf ist, und aus Frachtkult ich await
es.
Aber ist dies der effizienteste / korrekteste Weg, um mit diesem Muster umzugehen? Mir scheint, ich könnte await
den letzten Anruf überspringen , aber was ist, wenn er fehlschlägt? Und sollte ich eine Task
Methode verwenden, ContinueWith
um meine synchrone Arbeit mit dem ursprünglichen Aufruf zu verketten? Ich bin gerade an einem Punkt angelangt, an dem ich nicht sicher bin, ob ich damit richtig umgehe.
Gibt es angesichts des Codes im Beispiel eine bessere Möglichkeit, diese Aufrufkette für asynchrone / synchrone / asynchrone Methoden zu handhaben?