【发布时间】:2015-11-23 11:20:42
【问题描述】:
我有一份工作要做。我想以有序的方式并行运行它们。但是有序并行试图将方法拆分为块,然后以有序的方式执行块。
这是重现的问题。
var list = Enumerable.Range(0, 1000).ToList();
list.AsParallel().AsOrdered().ForAll(i =>
{
Task.Delay(1000).Wait();
Console.WriteLine(i);
});
我希望这首先从一开始就打印值。喜欢或类似的东西
1
0
2
3
但这是结果。
这意味着有序并行将列表分成块并开始按顺序执行它们。但我不希望它从列表中间执行任务。我该如何解决这个问题?
我注意到,如果我不使用 List 而使用 IEnumerable,它可以解决问题并防止拆分。我认为这是因为 Enumerable 不包含所有值,因此无法进行划分。
var list = Enumerable.Range(0, 1000); // removed ToList
结果会变成我想要的。
但我已经填写了一个列表。我没有纯粹的 ienumerable 我怎么试过的
list.AsEnumerable().AsParallel().AsOrdered()....
但并行仍然开始拆分列表。是否有任何并行选项可以避免这种情况?
如果不是,问题可能会变成如何将 List 显式转换为 Enumerable?这里list.AsEnumerable() 似乎仍然是潜在的列表。如何获得纯可枚举?
【问题讨论】:
标签: c# list parallel-processing ienumerable