我想在不破坏并行性的情况下为ParallelQuery编写Map-Extension方法。问题是,我不知道如何。我正在使用ParallelQuery,因为我相信多线程会提高我的性能,这是我的代码到目前为止:
public static List<T2> Map<T, T2>(this ParallelQuery<T> source, Func<T, T2> func)
{
List<T2> result = new List<T2>();
foreach(T item in source)
{
result.Add(func(item));
}
return result;
}
正如你所看到的,如果我是正确的,这种方式会破坏并行性的目的。我该如何正确地做到这一点?
感谢Dykam指出Select
- 方法正是我想要的行为。但是,仅仅为了学习目的,我想看看这是如何工作的,谢谢!
答案 0 :(得分:2)
你的问题激怒了我的开发者的心脏,所以我再次把它拿出来并想出了这个:
public static IEnumerable<T2> Map<T,T2>(this ParallelQuery<T> source, Func<T,T2> func)
{
var list = new ConcurrentBag<T2>();
source.ForAll(s => list.Add(func(s)));
return list.ToList();
}
ForAll
并行循环遍历source
查询,并将结果添加到线程安全集合中。
当我需要类似Select的行为时,我会牢记这一点。当函数func
是一个相对繁重的过程时,这可能是一种有效的方法。