Итеративная асинхронная область действия c - PullRequest
0 голосов
/ 01 марта 2020

В следующем блоке кода:

static void Main(string[] args)
        {
            List<int> arr00 = new List<int>() {100, 0, 3, 8, 21};
            int index = 0;
            int tasks = 0;
            foreach (int num in arr00)
            {
                var innerIndex = index;
                Task.Run(async () =>
                {
                    Console.WriteLine($"{index}, {innerIndex}: {num}");
                    tasks++;
                });

                index++;
            }

            while (tasks < index) { }
        }

Выходные данные: 5, 1: 0 5, 4: 21 5, 2: 3 5, 3: 8 5, 0: 100

Как задача asyn c сохранила правильный счетчик для innerIndex, но не индекс подъема ?

Спасибо

1 Ответ

0 голосов
/ 01 марта 2020

foreach l oop запускает task завершает итерацию, запускает еще один task в следующей итерации и так далее. fareach завершает все итерации и устанавливает значение index равным 5 даже до запуска 1-й задачи. Вот почему вы найдете значение index как 5 для всех задач. Теперь, если вы добавите Wait каждую задачу для завершения, тогда значения index и innerIndex будут совпадать. Но вы потеряете преимущество параллельного выполнения этой задачи.

Измените код следующим образом:

foreach (int num in arr00)
{
    var innerIndex = index;
    Task.Run(async () =>
    {
        Console.WriteLine($"{index}, {innerIndex}: {num}");
        tasks++;
    }).Wait();  //Wait for task to complete

    index++;
}

Вывод:

0, 0: 100
1, 1: 0
2, 2: 3
3, 3: 8
4, 4: 21
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...