Почему параллельные задачи не выполняются? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть этот код, это скелет большей функциональности, урезанный, чтобы доказать проблему:

        var tasks = Enumerable.Range(0, 10)
            .Select(laneNo => Task.Run(() => Console.WriteLine($"Starting generator for lane {laneNo}")));

        for(int r=0; ;++r)
        {
            Task.Delay(TimeSpan.FromSeconds(3)).Wait();

            Console.WriteLine($"Iteration {r} at {DateTime.Now}");
        }

Я никогда не вижу, чтобы «Запуск генератора» выводился на консоль, но я вижу запуск итерации каждые 3 секунд - что-то заставляет эти задачи не выполняться (в реальном коде они выполняются в течение значительного периода времени, но удаление, которое не влияет на проблему).

Почему не выполняется первая группа задач? Моя теория связана с Task.Delay?

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Ваш linq-statment никогда не материализуется. Операторы Linq, такие как Select, Where, OrderBy и др. c, работают как строительные блоки, которые вы объединяете в цепочку, но они не выполняются, пока вы не выполните его через foreach или не используете операторы, которые не возвращают перечислимые значения, такие как ToArray, ToList, First, Last et c.

Если вы в конце вызываете ToList, вы должны увидеть выполнение всех задач, но если вы только вызываете First, вы должны увидеть только одну, потому что итерация вашего исходного Range затем прекратится после первого элемента.

1 голос
/ 21 апреля 2020

LINQ Select имеет отложенное выполнение; он просто определяет итератор, поэтому ваши Task s не генерируются.

Вы можете использовать Task.WhenAll(IEnumerable<Task>), который будет повторяться и ждать каждого Task, генерируя новый Task, который завершается после завершения всех предоставленных задач:

var tasks = Enumerable.Range(0, 10)
        .Select(laneNo => Task.Run(() => Console.WriteLine($"Starting generator for lane {laneNo}")));

await Task.WhenAll(tasks);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...