Ordered Parallel 未按预期工作。 (将列表转换为 IEnumerable?)

Ordered Parallel is not working as expected. (Convert List into 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
3

但这是结果。

这意味着有序并行将列表分成块并开始按顺序执行它们。但我不希望它从列表中间执行任务。我该如何解决这个问题?

我注意到如果我不使用 List 而是使用 IEnumerable,它可以解决问题并防止拆分。我认为这是因为 Enumerable 不包含所有值,所以不可能进行划分。

var list = Enumerable.Range(0, 1000); // removed ToList

结果会变成我想要的样子。

但我已经填充了一个列表。我没有纯粹的 ienumerable 我怎么试过

list.AsEnumerable().AsParallel().AsOrdered()....

但是parallel还是开始拆分列表。是否有任何并行选项可以避免这种情况?

如果不是,问题可能会变成如何将 List 显式转换为 Enumerable?这里 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