【问题标题】:Ordered Parallel is not working as expected. (Convert List into IEnumerable?)Ordered Parallel 未按预期工作。 (将列表转换为 IEnumerable?)
【发布时间】: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


    【解决方案1】:

    看起来你可以更简单地实现所需的效果:

    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 Task.Delay(20000).Wait();
    • 我来自here。好的答案已由usr 发布,但未被接受。我很确定 OP 有这个问题
    猜你喜欢
    • 2021-07-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多