在 Parallel.Foreach 中使用 LINQ

Using LINQ in Parallel.Foreach

我有以下正常的 foreach 使用 LINQ 查询,我如何使用 Parallel.Foreach

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

我要怎么做才能像

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

好吧...基本上就像您说的...但是...请记住,如果您需要对结果进行排序并据此采取行动,那么这并不是真正的平行...

linq parallel foreach 将对您的集合进行分区并同时对其进行处理,您还需要考虑到这一点,以确保您的 this.Update 可以与多个用户一起工作而不会弄乱。

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

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.

});

你可以做任何一个

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

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

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

试试这个:

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

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

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