为什么并行任务不是运行?
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);
我有这段代码,它是用于证明问题的更大功能的骨架:
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);