C# 有序并行未按预期工作。(将列表转换为IEnumerable?)
我有一个工作清单要做。我想以有序的方式并行运行它们。但ordered parallel试图将方法分割成块,然后按顺序执行块 这就是问题所在C# 有序并行未按预期工作。(将列表转换为IEnumerable?),c#,list,parallel-processing,ienumerable,C#,List,Parallel Processing,Ienumerable,我有一个工作清单要做。我想以有序的方式并行运行它们。但ordered parallel试图将方法分割成块,然后按顺序执行块 这就是问题所在 var list = Enumerable.Range(0, 1000).ToList(); list.AsParallel().AsOrdered().ForAll(i => { Task.Delay(1000).Wait(); Console.WriteLine(i); }); 我希望它从一开始就首先打印值。像这样的 1 0 2
var list = Enumerable.Range(0, 1000).ToList();
list.AsParallel().AsOrdered().ForAll(i =>
{
Task.Delay(1000).Wait();
Console.WriteLine(i);
});
我希望它从一开始就首先打印值。像这样的
1
0
2
3
但结果如下
这意味着ordered parallel将列表划分为块,并开始按顺序执行它们。但我不想让它执行列表中间的任务。如何修复此行为
我注意到,如果我不使用列表,而是使用IEnumerable,它可以修复问题并防止拆分。我认为这是因为枚举表并没有保存所有的值,所以不可能进行除法
var list = Enumerable.Range(0, 1000); // removed ToList
结果会变成这个,这就是我想要的
但我已经填写了一份清单。我不知道我怎么试过
list.AsEnumerable().AsParallel().AsOrdered()....
但parallel仍开始分裂名单。有没有类似的选择来避免这种情况
如果不是,问题可能会变成如何显式地将列表转换为可枚举的?这里的
list.AsEnumerable()
似乎仍然是潜在的列表。如何获得纯可枚举性?看起来您可以更简单地实现所需的效果:
var list = Enumerable.Range(0, 1000).ToList();
list
.Select(x=>x) // !
.AsParallel().AsOrdered().ForAll(i =>
{
Task.Delay(1000).Wait();
Console.WriteLine(i);
});
list.AsEnumerable()
不是一个潜在的列表,而是list
本身
var L = list.AsEnumerable();
bool e = ReferenceEquals(L, list);
// e is True, they are same objects
我现在觉得自己很愚蠢。无论如何,这是完美的!非常感谢。@M.kazemAkhgary,谢谢。我一直在用这个样品做实验。方法演示了有趣的行为,如果某些任务比其他任务花费更长的时间,例如:
if(i%5!=0)Task.Delay(1000.Wait();else任务。延迟(20000)。等待()代码>我来自。好的答案已由发布,但未被接受。我很确定OP有这个问题