Ok, to brzmi dziwnie, ale kod jest bardzo prosty i dobrze wyjaśnia sytuację.
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));
}
(Wiem, że mówię trochę w streszczeniu poniżej, ale powyższe jest faktyczną metodą z tego, co będzie rzeczywistym kodem produkcyjnym, który faktycznie robi to, o co tutaj pytam, i jestem naprawdę zainteresowany twoją recenzją dla poprawności względem wzorca asynchronicznego / oczekiwania).
Coraz częściej spotykam się z tym wzorcem, kiedy używam async
/ await
more. Wzór składa się z następującego łańcucha zdarzeń:
- Poczekaj na pierwsze połączenie, które dostarczy mi informacji, nad którymi muszę pracować
- Pracuj nad tymi informacjami synchronicznie
- Poczekaj na ostatnie połączenie, które zapisuje zaktualizowaną pracę
Powyższy blok kodu to zazwyczaj sposób, w jaki zajmuję się obsługą tych metod. I await
pierwsze połączenie, które muszę, ponieważ jest asynchroniczne. Następnie wykonuję pracę, którą muszę wykonać, która nie jest związana z operacjami wejścia / wyjścia ani zasobami, a więc nie jest asynchroniczna. Na koniec oszczędzam swoją pracę, która jest również async
wezwaniem, i poza kultem ładunkowym await
to ja .
Ale czy jest to najbardziej wydajny / prawidłowy sposób obsługi tego wzoru? Wydaje mi się, że mogę pominąć await
ostatnie połączenie, ale co jeśli się nie powiedzie? I czy powinienem zastosować Task
metodę taką jak połączenie ContinueWith
mojej pracy synchronicznej z pierwotnym wywołaniem? Jestem teraz w punkcie, w którym nie jestem pewien, czy radzę sobie z tym poprawnie.
Biorąc pod uwagę kod z przykładu , czy istnieje lepszy sposób na obsługę tego łańcucha wywołań metody async / sync / async?