In .net le parole chiave async await
sono un'estensione della Libreria parallela attività. Quando non fai await
un metodo async
equivale a chiamare Task.Run(()=>A())
.
Nel tuo esempio, A () verrebbe avviato, restituire il controllo a await B()
e quindi il codice che chiama A()
continuerà mentre A()
era in attesa del completamento di B()
.
Un semplice esempio potrebbe essere il seguente:
static void Main(string[] args)
{
Console.WriteLine("Starting main");
A();
Console.WriteLine("Finished Main");
//dont end before A() finishes.
Console.ReadLine();
}
static async Task A()
{
Console.WriteLine("starting A");
await B();
Console.WriteLine("Finishing a");
}
static async Task B()
{
//Add a delay before the Console.WriteLine
await Task.Delay(1000);
Console.WriteLine("starting B");
await Task.Delay(1000);
Console.WriteLine("Finishing b");
}
Quando il metodo principale chiama A()
l'esecuzione è seriale fino a await B()
. Dopo che A()
attende, il controllo viene restituito al main che termina. A questo punto A()
è ancora disponibile con "Fire and Forget", che non è corretto nel caso di un programma di console, quindi è necessario assicurarsi che il thread principale non venga completato prima della fine di A()
. Se non abbiamo il Console.ReadLine();
il programma terminerà dopo la chiamata a await
in A()
.