De acuerdo, suena extraño, pero el código es muy simple y explica bien la situación.
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));
}
(Sé que estoy hablando más o menos en el resumen a continuación, pero lo anterior es un método real de lo que será el código de producción real que realmente está haciendo lo que estoy preguntando aquí, y estoy realmente interesado en que realmente revise para la corrección con respecto al patrón asíncrono / espera).
Me encuentro con este patrón cada vez más a menudo ahora que estoy usando async
/ await
more. El patrón consta de la siguiente cadena de eventos:
- Espero una llamada inicial que me proporciona información sobre la que necesito trabajar
- Trabaja en esa información sincrónicamente
- Espere una llamada final que guarde el trabajo actualizado
El bloque de código anterior es típicamente cómo hago para manejar estos métodos. Yo await
la primera llamada, que tengo que hacerlo porque es asíncrona. A continuación, hago el trabajo que necesito hacer, que no está vinculado a recursos ni a IO, por lo que no es asíncrono. Finalmente, guardo mi trabajo, que también es una async
llamada, y fuera del culto a la carga await
.
¿Pero es esta la forma más eficiente / correcta de manejar este patrón? Me parece que podría saltarme await
la última llamada, pero ¿y si falla? ¿Y debo usar un Task
método como ContinueWith
encadenar mi trabajo sincrónico con la llamada original? Ahora mismo estoy en un punto en el que no estoy seguro de si estoy manejando esto correctamente.
Dado el código en el ejemplo , ¿hay una mejor manera de manejar esta cadena de llamadas del método async / sync / async?