【发布时间】:2020-04-22 02:40:52
【问题描述】:
我有这段代码,它是为了证明问题而剥离的更大功能的骨架:
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有关吗?
【问题讨论】:
-
(顺便说一下,这是一个测试应用程序/模拟器的快速'n'dirty代码)
-
如果您只是想并行运行一些同步代码,只需使用 Parallel.ForEach 即可。
-
您在代码的哪个位置显示并行任务?您的 for 循环只是按顺序显示任务。你的任务可能在你进入 for 循环之前就终止了。
-
@jdweng 他们根本没有运行。在真正的代码中,他们会做更长的事情,但由于他们甚至不打印到控制台,所以出了点问题
-
另外@jdweng 它仍然是并行的。如果您以这种方式运行“显示任务”,通常会看到它们无序打印。