如何在不破坏其目的的情况下为ParallelQuery编写Map-Method?

时间:2012-03-12 13:53:14

标签: c# multithreading linq extension-methods parallel-processing

我想在不破坏并行性的情况下为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 - 方法正是我想要的行为。但是,仅仅为了学习目的,我想看看这是如何工作的,谢谢!

1 个答案:

答案 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是一个相对繁重的过程时,这可能是一种有效的方法。