在Parallel.Foreach中使用LINQ

时间:2015-01-01 06:14:47

标签: c# linq foreach

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

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

我怎么能这样做

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

5 个答案:

答案 0 :(得分:9)

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.

});

答案 1 :(得分:9)

首先,Where(x => x is Video)可以替换为OfType<Video>() 其次,对于流利的语法,最好使用ParallelEnumerable.ForAll扩展方法:

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

答案 2 :(得分:3)

你可以做任何一次

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

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

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

答案 3 :(得分:1)

试试这个:

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

答案 4 :(得分:0)

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

linq并行foreach将对您的收藏进行分区并同时对其进行处理,您还需要考虑这一点,确保您的this.Update可以与多个用户合作而不会搞砸。

那么,问题到底是什么?