在 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)
我有以下正常的 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)