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
我有一份工作清单。我想以有序的方式并行 运行 它们。但是 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