L'omissione dell'attesa della parola chiave una volta nello stack di chiamate interrompe il comportamento asincrono dell'intero stack?

1

Lo stack di chiamate può contenere diversi metodi che restituiscono Task . Se tutti sono decorati con async , il flusso di esecuzione è abbastanza semplice. Tuttavia, cosa succede se uno di questi non è await ed - ci sono altre chiamate di metodo da quel metodo eseguito in modo asincrono o no?

Ecco un esempio:

Se ho

async Task A()
{
    ...
    await B();
    ...
}

e se chiamo A(); e non await (A); - sarà atteso await B(); ?

    
posta nicks 18.09.2016 - 15:34
fonte

1 risposta

3

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

    
risposta data 18.09.2016 - 17:29
fonte

Leggi altre domande sui tag