Async и Await - Как поддерживается порядок исполнения?

Я на самом деле читаю некоторые темы о параллельной библиотеке задач и асинхронном программировании с асинхронным и ожидающим. В книге «C # 5.0 в двух словах» говорится, что при ожидании выражения с использованием ключевого слова await компилятор преобразует код во что-то вроде этого:

var awaiter = expression.GetAwaiter();
awaiter.OnCompleted (() =>
{
var result = awaiter.GetResult();

Предположим, у нас есть эта асинхронная функция (также из упомянутая книга):

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!");
}

Вызов метода GetPrimesCountAsync будет помещен в очередь и выполнен в потоке пула. В общем, вызов нескольких потоков из цикла for может привести к возникновению условий гонки.

Итак, как CLR обеспечивает обработку запросов в том порядке, в котором они были сделаны? Я сомневаюсь, что компилятор просто преобразует код указанным выше способом, так как это отделит метод GetPrimesCountAsync от цикла for.

8
задан Dennis Kassel 29 July 2015 в 15:54
поделиться