Mi sono imbattuto in questo con la stessa domanda in mente, eppure dopo aver letto le risposte la domanda sembra indugiare, confusa dai riferimenti alla "magia sotto il cofano".
Dalla summenzionata programmazione asincrona :
- The
async
keyword turns a method into an async method, which allows you to use the await
keyword in its body.
- When the
await
keyword is applied, it suspends the calling method and yields control back to its caller until the awaited task is complete.
-
await
can only be used inside an async
method.
Il contesto che incontra await
viene bloccato?
-
Sì . Questa è essenzialmente una barriera di sincronizzazione locale per mantenere uno stato conosciuto nel contesto dell'esecuzione; tranne che gli altri contesti, se presenti, non sono uniti.
Il resto del blocco dell'applicazione si trova in await
?
-
Dipende da come è scritta la tua applicazione. Se si tratta di una serie di compiti dipendenti await
ed avviati sequenzialmente nello stesso contesto (vedi: Cercando di capire alcuni comportamenti asincroni / attendi )
await asyncCall1();
await asyncCall2(); // waits for asyncCall1() to complete
in questo modo ogni await
bloccherebbe lo spawning del prossimo.
D'altro canto, le stesse attività dipendenti avviate in parallelo sarebbero eseguite in parallelo e il contesto si limiterebbe a bloccare il resp. await
:
Task<int> t1 = asyncCall1();
Task<string> t2 = asyncCall2(); // runs in parallel with asyncCall1()
int val = await t1;
string str = await t2; // waits for asyncCall1() to complete
In generale, await
fornisce l'esecuzione al contesto esterno, da cui viene chiamato il contesto corrente. Tuttavia, se il contesto esterno in sé è in attesa della corrente, è come un% sequenziale% co_de nello stesso contesto.
Quindi, per raccogliere i benefici di await
, è necessario progettare l'applicazione per eseguire diversi contesti paralleli (UI, data-client, ecc.), quindi async
in un contesto produce l'esecuzione in altri contesti, quindi l'intero l'applicazione non bloccherebbe su un singolo await
.