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() .