Ciao Daniele, async non è una classe, ma piuttosto un hint che viene dato al compilatore per suggerirgli che il metodo marcato con l'async conterrà metodi asincroni e che dovrà gestire la continuazione dei task a compile time. Per lo sviluppatore una volta creare procedure asincrone, che si sincronizzini tra loro con un opportuno ordine, voleva dire spezzare un metodo in più metodi, portarsi in giro stati, ecc... poi con l'avvento della TPL (task programming language) e i Task, il tutto era migliorato con questa libreria che permetteva di sfruttare questo concetto di Task e di continuazione .ContinueWith():
Task.Start(() => { ..... })
.ContinueWith(t => { .... });
ma anche con quel metodo l'ordine delle istruzione, e il metodo di sviluppo doveva ovviamente cambiare, rendendo di fatto il codice più complicato. Con l'avvento di async/await, si è fatto un ulteriore passo avanti, facendo creare al compilatore la separazione in più metodi e il passaggio di stato, così facendo, nascondendo completamente allo sviluppatore la continuazione di un task e la sua gestione, ritornando ad avere un codice ordinato e meno complesso, anche se questo non vuol dire che non bisogna sapere cosa si sta utilizzando, perchè anche se non si vede, al di sotto si stanno sfruttando parecchi meccanismi che influenzano il comportamento dell'applicazione:
http://msdn.microsoft.com/it-it/library/hh191443.aspx
Michael Denny | Microsoft Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.net
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic