Va bene, sembra strano, ma il codice è molto semplice e spiega bene la situazione.
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));
}
(So che sto parlando in qualche modo nell'abstract qui sotto, ma quanto sopra è un metodo reale da quello che sarà il vero codice di produzione che sta effettivamente facendo quello che sto chiedendo qui, e sono davvero interessato alla tua recensione per correttezza nei confronti del modello asincrono / attesa.)
Sto incontrando questo schema sempre più spesso ora che sto usando async
/ await
altro. Il modello è costituito dalla seguente catena di eventi:
- Attendere una chiamata iniziale che mi dia alcune informazioni su cui ho bisogno di lavorare
- Lavora su tali informazioni in modo sincrono
- Attendere un'ultima chiamata per salvare il lavoro aggiornato
Il blocco di codice sopra è in genere il modo in cui gestisco questi metodi. Io await
la prima chiamata, che devo fare perché è asincrona. Successivamente, faccio il lavoro che devo fare che non è associato a IO o alle risorse, quindi non è asincrono. Infine, salvo il mio lavoro, che è anche un async
appello, e per culto await
.
Ma è questo il modo più efficiente / corretto per gestire questo modello? Mi sembra che potrei saltare await
l'ultima chiamata, ma cosa succede se fallisce? E dovrei usare un Task
metodo come quello ContinueWith
di concatenare il mio lavoro sincrono con la chiamata originale? Sono solo in un momento in cui non sono sicuro di gestirlo correttamente.
Dato il codice nell'esempio , esiste un modo migliore per gestire questa catena di chiamate del metodo asincrono / sincronizzato / asincrono?