Ok, parece estranho, mas o código é muito simples e explica bem a situação.
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));
}
(Eu sei que estou falando mais ou menos no resumo abaixo, mas o acima é um método real do que será o código de produção real que está realmente fazendo o que estou perguntando aqui e estou realmente interessado em revisar para correção em relação ao padrão assíncrono / espera.)
Estou encontrando esse padrão cada vez mais agora que estou usando async
/ await
more. O padrão consiste na seguinte cadeia de eventos:
- Aguarde uma ligação inicial que receba algumas informações nas quais preciso trabalhar
- Trabalhe nessas informações de forma síncrona
- Aguarde uma chamada final que salve o trabalho atualizado
O bloco de código acima é geralmente o modo como lidarei com esses métodos. Eu sou await
a primeira chamada, que eu tenho que fazer porque é assíncrona. Em seguida, faço o trabalho necessário, que não é de E / S ou recurso vinculado e, portanto, não é assíncrono. Por fim, guardo meu trabalho, que também é uma async
ligação, e do culto à carga eu await
o faço .
Mas essa é a maneira mais eficiente / correta de lidar com esse padrão? Parece-me que eu poderia pular await
a última ligação, mas e se ela falhar? E devo usar um Task
método como ContinueWith
encadear meu trabalho síncrono com a chamada original? Agora estou em um ponto em que não tenho certeza se estou lidando com isso corretamente.
Dado o código no exemplo , existe uma maneira melhor de lidar com essa cadeia de chamadas de método async / sync / async?