In realtà sto leggendo alcuni argomenti relativi alla libreria parallela Task e alla programmazione asincrona con asincrona e attesa. Il libro "C# 5.0 in a Nutshell", afferma che, quando in attesa di un'espressione utilizzando la parola chiave attendono, il compilatore trasforma il codice in qualcosa di simile a questo:Async and Await - Come viene mantenuto l'ordine di esecuzione?
var awaiter = expression.GetAwaiter();
awaiter.OnCompleted (() =>
{
var result = awaiter.GetResult();
Supponiamo, abbiamo questa funzione asincrona (anche dal di cui libro):
async Task DisplayPrimeCounts()
{
for (int i = 0; i < 10; i++)
Console.WriteLine (await GetPrimesCountAsync (i*1000000 + 2, 1000000) +
" primes between " + (i*1000000) + " and " + ((i+1)*1000000-1));
Console.WriteLine ("Done!");
}
la chiamata del metodo 'GetPrimesCountAsync' saranno accodati ed eseguito su un thread pool. In generale, invocare più thread all'interno di un ciclo for ha il potenziale per introdurre condizioni di gara.
Quindi, come fa il CLR a garantire che le richieste vengano elaborate nell'ordine in cui sono state elaborate? Dubito che il compilatore converta semplicemente il codice nel modo sopra descritto, poiché ciò disaccoppierà il metodo 'GetPrimesCountAsync' dal ciclo for.
Crea una macchina a stati. Inoltre, il codice non verrà eseguito in parallelo, ma semplicemente libererà il thread mentre attende che ogni chiamata a 'GetPrimesCountAsync' venga completata in ordine. – juharr