Как написать Map-метод для ParallelQuery без ущерба для его цели? - PullRequest
5 голосов
/ 12 марта 2012

Я хотел бы написать метод расширения карты для ParallelQuery, не разрушая параллелизм.Проблема в том, что я понятия не имею, как.Я использую 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 -Metod именно то поведение, которое я хочу.Тем не менее, просто в целях обучения я хотел бы посмотреть, как именно это будет работать, спасибо!

1 Ответ

2 голосов
/ 13 марта 2012

Ваш вопрос задет мне в сердце разработчика, поэтому я снова поднял его и придумал следующий:

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 параллельно и добавляет результат кПотокобезопасная коллекция.

Я вспоминаю об этом, когда мне нужно поведение, подобное выбору, с некоторым личным поворотом.Это может быть эффективным подходом, когда функция func является относительно тяжелым процессом.

...