为什么并行任务不是运行?

Why are parallel tasks not running?

我有这段代码,它是用于证明问题的更大功能的骨架:

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

我从来没有看到 "Starting generator" 打印到控制台,但我确实看到迭代每 3 秒触发一次 - 有些事情导致这些任务没有进展(在实际代码中,它们 运行 很长一段时间但删除它不会影响问题)。

为什么第一批任务不是 运行ning?我的理论是它与 Task.Delay?

有关

您的 linq 语句从未具体化。 Select、Where、OrderBy 等 Linq 运算符作为您链接在一起的构建块工作,但在您通过 foreach 运行 或使用不 return 的运算符之前它们不会执行枚举,如 ToArray、ToList、First、Last 等

如果您在最后调用 ToList,您应该会看到所有正在执行的任务,但如果您只调用 First,您应该只会看到一个任务,因为原始 Range 的迭代将在第一个元素之后终止。

LINQ Select 已延迟执行;它只是定义了一个迭代器,因此不会生成您的 Task

您可以使用 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);