Dopo aver a che fare con il modello di attesa / attesa di C # per un po 'di tempo, mi sono reso conto improvvisamente che non so davvero come spiegare ciò che accade nel seguente codice:
async void MyThread()
{
while (!_quit)
{
await GetWorkAsync();
}
}
Si presume che GetWorkAsync()
restituisca un% co_de attendibile che potrebbe o meno causare un cambio di thread quando viene eseguita la continuazione.
Non sarei confuso se l'attesa non fosse all'interno di un loop. Mi aspetto naturalmente che il resto del metodo (ovvero la continuazione) possa essere eseguito su un altro thread, il che va bene.
Tuttavia, all'interno di un ciclo, il concetto di "resto del metodo" diventa un po 'annebbiato per me.
Che cosa succede a "il resto del ciclo" se il thread viene acceso in continuazione o se non viene cambiato? Su quale thread è la successiva iterazione del ciclo eseguito?
Le mie osservazioni mostrano (non verificate in modo conclusivo) che ogni iterazione inizia sullo stesso thread (quello originale) mentre la continuazione viene eseguita su un altro. Può essere davvero? In caso affermativo, si tratta quindi di un grado di parallelismo inaspettato che deve essere tenuto in considerazione per quanto riguarda la sicurezza del thread del metodo GetWorkAsync?
AGGIORNAMENTO: la mia domanda non è un duplicato, come suggerito da alcuni. Il modello di codice Task
è semplicemente una semplificazione del mio codice attuale. In realtà, il mio thread è un ciclo di lunga durata che elabora la coda di input degli elementi di lavoro a intervalli regolari (ogni 5 secondi per impostazione predefinita). Anche il controllo della condizione di uscita effettiva non è un semplice controllo sul campo, come suggerito dal codice di esempio, ma piuttosto un controllo di gestione degli eventi.