Ok, 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 astratto qui sotto, ma quanto sopra è un metodo effettivo da quello che sarà il vero codice di produzione che sta effettivamente facendo quello che sto chiedendo qui, e sono realmente interessato a lo stai effettivamente rivedendo per correttezza rispetto al modello asincrono / atteso.)
Sto incontrando questo schema sempre più spesso ora che sto usando async
/ await
di più. Il pattern è costituito dalla seguente catena di eventi:
- Attendi una chiamata iniziale che mi fornisca alcune informazioni su cui devo lavorare
- Lavora in modo sincrono su tali informazioni
- Attendi una chiamata finale che salva il lavoro aggiornato
Il blocco di codice sopra riportato è in genere il modo in cui utilizzo questi metodi. I await
la prima chiamata, che devo perché è asincrona. Successivamente, eseguo il lavoro che devo eseguire, che non è legato all'IO o alla risorsa, quindi non è asincrono. Infine, salverò il mio lavoro che è anche una chiamata async
, e fuori carico-cult I await
it.
Ma è questo il modo più efficiente / corretto per gestire questo modello? Mi sembra che potrei saltare await
nell'ultima chiamata, ma cosa succede se fallisce? E dovrei usare un metodo Task
come ContinueWith
per concatenare il mio lavoro sincrono con la chiamata originale? Sono solo in un punto in questo momento in cui non sono sicuro se sto gestendo correttamente questo.
Dato il codice nell'esempio , c'è un modo migliore per gestire questa catena di chiamate del metodo asincrono / sincronizzazione / asincrona?