Dopo aver avuto a che fare con il modello asincrono / attesa di C # da un po 'di tempo, improvvisamente ho capito che non so davvero come spiegare cosa succede nel seguente codice:
async void MyThread()
{
while (!_quit)
{
await GetWorkAsync();
}
}
GetWorkAsync()
si presume che restituisca un aspetto Task
che può o meno causare un cambio di thread quando viene eseguita la continuazione.
Non sarei confuso se l'attesa non fosse all'interno di un ciclo. Mi aspetto naturalmente che il resto del metodo (ovvero la continuazione) venga potenzialmente eseguito su un altro thread, il che va bene.
Tuttavia, all'interno di un ciclo, il concetto di "il resto del metodo" diventa un po 'confuso per me.
Cosa succede al "resto del loop" se il thread è attivato in continuazione vs. se non lo è? Su quale thread viene eseguita la successiva iterazione del loop?
Le mie osservazioni mostrano (non definitivamente verificato) che ogni iterazione inizia sullo stesso thread (quello originale) mentre la continuazione viene eseguita su un altro. Questo può essere davvero? In caso affermativo, si tratta di un grado di parallelismo inaspettato che deve essere tenuto in considerazione per la sicurezza dei thread del metodo GetWorkAsync?
AGGIORNAMENTO: La mia domanda non è un duplicato, come suggerito da alcuni. Il while (!_quit) { ... }
modello di codice è semplicemente una semplificazione del mio codice attuale. In realtà, il mio thread è un ciclo di lunga durata che elabora la sua coda di input degli elementi di lavoro a intervalli regolari (ogni 5 secondi per impostazione predefinita). Il controllo effettivo della condizione di chiusura non è inoltre un semplice controllo sul campo come suggerito dal codice di esempio, ma piuttosto un controllo dell'handle dell'evento.