D'accord, cela semble étrange, mais le code est très simple et explique bien la situation.
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));
}
(Je sais que je parle en quelque sorte dans l'abstrait ci-dessous, mais ce qui précède est une méthode réelle de ce qui sera le code de production réel qui fait réellement ce que je demande ici, et je suis réellement intéressé par votre examen pour l'exactitude par rapport au modèle asynchrone / attente.)
Je rencontre ce modèle de plus en plus souvent maintenant que j'utilise async/ awaitmore. Le modèle se compose de la chaîne d'événements suivante:
- Attendez un premier appel qui me fournira des informations sur lesquelles je dois travailler
- Travailler sur ces informations de manière synchrone
- Attendre un dernier appel qui enregistre le travail mis à jour
Le bloc de code ci-dessus est généralement la façon dont je gère ces méthodes. Je awaitle premier appel, que je dois parce qu'il est asynchrone. Ensuite, je fais le travail que je dois faire, qui n'est pas lié aux E / S ou aux ressources, et qui n'est donc pas asynchrone. Enfin, j'enregistre mon travail qui est aussi un asyncappel, et hors du cargo-culte je awaitle fais .
Mais est-ce la façon la plus efficace / correcte de gérer ce modèle? Il me semble que je pourrais sauter awaitle dernier appel, mais qu'en est-il en cas d'échec? Et dois-je utiliser une Taskméthode telle que ContinueWithde chaîner mon travail synchrone avec l'appel d'origine? Je suis juste à un point en ce moment où je ne sais pas si je gère cela correctement.
Compte tenu du code de l'exemple , existe-t-il une meilleure façon de gérer cette chaîne d'appel de méthode async / sync / async?