Ho appena provato qualcosa che ero sicuro che sarebbe fallito miseramente, ma con mia sorpresa, ha funzionato perfettamente, e dimostra a me stesso che sono ancora abbastanza disorientato da come funziona async-await
.Async thread body loop, funziona, ma come?
Ho creato un thread, passando un delegato async void
come corpo del thread. Ecco una semplificazione eccessiva del mio codice:
var thread = new Thread(async() => {
while(true) {
await SomeLengthyTask();
...
}
});
thread.Start();
thread.Join();
Il fatto è che, per quanto ho capito, quando l'esecuzione colpisce la parola await
, c'è un rendimento implicito dal metodo, in questo caso il corpo del looping thread, mentre il resto del codice è avvolto in una continuazione di callback.
A causa di questo fatto, ero abbastanza sicuro che il thread sarebbe terminato non appena il await
ha dato esecuzione, ma non è il caso!
Qualcuno sa come questa magia sia effettivamente implementata? La funzionalità async
è ridotta in ordine e l'async
attende in modo sincrono oppure è in corso una magia nera da parte del CLR che consente di riprendere un thread che ha restituito uno await
?
Grazie per il corretto chiarimento tra lambda e delegato, ho modificato la mia domanda di conseguenza. Quindi, per capire, ciò che il CLR sta effettivamente facendo è semplicemente impedire che il join() del thread originale abbia luogo? – BlueStrat
@BlueStrat No, ha luogo. Questo è il motivo per cui ho aggiunto un "Console.ReadLine" nel mio esempio. Senza di essa la mia applicazione per console termina prima di raggiungere la parte interessante. – i3arnon
@BlueStrat Non c'è niente di speciale da fare qui. I metodi 'async' semplicemente non funzionano sullo stesso thread. Possono farlo, ma fino a quando non c'è un SynchronizationContext eseguono ogni parte sincrona sul ThreadPool – i3arnon