Parallel.ForEach в ConcurrentBag <T>потокобезопасный - PullRequest
10 голосов
/ 09 июля 2011

Описание ConcurrentBag на MSDN неясно:

Пакеты полезны для хранения объектов, когда порядок не имеет значения, и в отличие от наборов, пакеты поддерживают дубликаты.ConcurrentBag - это потокобезопасная реализация пакета, оптимизированная для сценариев, в которых один и тот же поток будет производить и потреблять данные, хранящиеся в пакете.

У меня вопрос, является ли он безопасным для потоков, и если это хорошая практикаиспользовать ConcurrentBag в Parallel.ForEach.

Для экземпляра:

    private List<XYZ> MyMethod(List<MyData> myData)
    {
        var data = new ConcurrentBag<XYZ>();

        Parallel.ForEach(myData, item =>
                        {
                            // Some data manipulation

                            data.Add(new XYZ(/* constructor parameters */);
                        });

        return data.ToList();
    }

Таким образом, мне не нужно использовать синхронизацию синхронизации в Parallel.ForEach с использованием обычного List.

Большое спасибо.

Ответы [ 2 ]

8 голосов
/ 09 июля 2011

Это выглядит хорошо для меня. То, как вы его используете, является поточно-ориентированным.

Если бы вы могли вернуть IEnumerable<XYZ>, его можно было бы сделать более эффективным, не копируя в List<T>, когда вы закончите.

0 голосов
/ 23 октября 2015

ConcurrentBag и Parallel.ForEach мне кажется, без проблем.Если вы используете эти типы в сценариях с многопользовательским доступом большого объема, эти классы в вашей реализации могут поднять процессорный процессор до уровней, которые могут привести к сбою вашего веб-сервера.Кроме того, эта реализация запускает N задач (потоков) для выполнения каждой из итераций, поэтому будьте осторожны при выборе этих классов и реализаций.Я недавно провел в этой ситуации, и мне пришлось извлечь дамп памяти, чтобы проанализировать, что происходит с ядром моего веб-приложения.Так что будьте осторожны, потому что Concurrentbag является ThreadSafe и в веб-сценариях это не лучший способ.

...