Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有序并行未按预期工作。(将列表转换为IEnumerable?)_C#_List_Parallel Processing_Ienumerable - Fatal编程技术网

C# 有序并行未按预期工作。(将列表转换为IEnumerable?)

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

我有一个工作清单要做。我想以有序的方式并行运行它们。但ordered parallel试图将方法分割成块,然后按顺序执行块

这就是问题所在

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有这个问题