L'introduzione di async/await in .NET ha permesso di creare applicazioni estremamente più performanti rispetto al passato senza dover stravolgere il nostro modo di scrivere codice. Tuttavia l'utilizzo di questa sintassi non è del tutto trasparente e spesso nasconde insidie se non la si utilizza nel modo corretto. Una delle caratteristiche nascoste dell'async/await è di generare il codice per una macchina a stati ogni volta che si usa la sintassi. Questo fa si che il codice generato sia lievemente più pesante rispetto al codice che non usa async/await. Esistono però die casi in cui possiamo usare i Task, ma senza usare async/await. Prendiamo come esempio il seguente codice.
public async Task ExternalMethod(string par)
{
ArgumentNullException.ThrowIfNullOrWhiteSpace(par);
await InnerMethod();
}
public async Task InnerMethod()
{
//esegue codice asincrono
}In questo esempio il compilatore crea due macchine a stati: una per la chiamata a InnerMethod e una per il codice dentro InnerMethod (presupponendo che al suo intero usiamo await). Tuttavia, ExternalMethod non esegue altro codice dopo la chiamata a InnerMethod. Per questo motivo possiamo evitare di usare await e tornare direttamente il Task restituito da InnerMethod, sarà compito di qualcosa al di sopra di ExternalMethod fare l'await del Task. possiamo quidni riscrivere il codice così.
public Task ExternalMethod(string par)
{
ArgumentNullException.ThrowIfNullOrWhiteSpace(par);
return InnerMethod();
}
public async Task InnerMethod()
{
//esegue codice asincrono
}In questo caso abbiamo tolto async/await da ExternalMethod eliminando una macchian a stati dal compilato. Va sottolineato che ovviamente questa tecnica può essere usata solo se dopo la chiamata a InnerMethod non deve essere eseguito alcun codice, altrimenti sarebbe obbligatorio usare async/await
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.


