【问题标题】:Using LINQ in Parallel.Foreach在 Parallel.Foreach 中使用 LINQ
【发布时间】:2015-02-27 23:46:03
【问题描述】:

我使用 LINQ 查询遵循正常的 foreach,如何使用 Parallel.Foreach

对其进行转换
foreach (var i in media.Where(x => x is Video)
{
    this.Update(i);
}

我该怎么做

Parallel.ForEach(media,i =>
{
    //LINQ
});

【问题讨论】:

  • 你尝试了什么?发生了什么?这和你想要发生的有什么不同?请参阅 stackoverflow.com/help/mcvestackoverflow.com/help/how-to-ask。该文档详细介绍了“如何做 X”,因此您可以从那里开始,如果您有问题,请发布一个具体问题,详细说明上述内容。

标签: c# linq foreach


【解决方案1】:

嗯......基本上就像你说的......但是......请记住,如果你需要订购结果并且你正在采取行动,它并不是真正的平行......

linq 并行 foreach 将分区您的集合并同时处理它,您还需要考虑确保您的 this.Update 可以与多个用户一起使用而不会搞砸。

那么,真正的问题是什么?

【讨论】:

    【解决方案2】:

    Parallel.ForEach 的第一个参数是可枚举的,所以显而易见的方法是:

    Parallel.ForEach(media.Where(x => x is Video).OrderBy(x => x.Contains("a")), i =>
    {
        //this.Update(i);
        // commented out because you'll probably want to Invoke it
        // depending on what it does exactly.
    
    });
    

    【讨论】:

    • 它说 NoOverload 方法 foreach 需要 1 个参数
    • 这是 2 个参数,可枚举和动作。
    【解决方案3】:

    你可以做任何一个

    Parallel.ForEach(media.Where(x => x is Video), this.Update);
    

    media.AsParallel().Where(x => x is Video).ForAll(this.Update);
    

    在并行过程中添加订单在这里没有意义。

    【讨论】:

    • 井序不存在
    • 您的问题中有 OrderBy。
    • 是的,那只是为了演示,抱歉:)
    【解决方案4】:

    试试这个:

    Parallel.ForEach<Video>(media.Where(x => x is Video), i =>
    {
        this.Update(i);
    };
    

    【讨论】:

      【解决方案5】:

      首先Where(x =&gt; x is Video)可以替换成OfType&lt;Video&gt;()
      其次,为了语法流畅,最好使用ParallelEnumerable.ForAll扩展方法:

      media.OfType<Video>()
          .AsParallel()
          .ForAll(this.Update)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多