[英]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}");
}
我从来没有看到“启动生成器”打印到控制台,但我确实看到迭代每 3 秒触发一次 - 某些原因导致这些任务无法进行(在实际代码中它们运行了很长一段时间,但删除它不会影响问题) .
为什么第一批任务没有运行? 我的理论是它与Task.Delay
有关吗?
您的 linq-statment 永远不会实现。 Linq 运算符,如 Select、Where、OrderBy 等,它们作为构建块链接在一起,但在您通过 foreach 运行它或使用不返回可枚举的运算符(如 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.