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
/ await
more. 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 await
le 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 async
appel, et hors du cargo-culte je await
le fais .
Mais est-ce la façon la plus efficace / correcte de gérer ce modèle? Il me semble que je pourrais sauter await
le dernier appel, mais qu'en est-il en cas d'échec? Et dois-je utiliser une Task
méthode telle que ContinueWith
de 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?