Как правильно использовать ConcurrentBag?C#

Место общения программистов C#
Ответить
Anonymous
 Как правильно использовать ConcurrentBag?

Сообщение Anonymous »

Я уже читал предыдущие вопросы о ConcurrentBag, но не нашел реального примера реализации многопоточности.


ConcurrentBag — это потокобезопасная реализация пакета, оптимизированная для сценариев, в которых один и тот же поток будет одновременно создавать и потреблять данные, хранящиеся в пакете".


В настоящее время это текущее использование в моем коде (это упрощение, а не фактические коды):

Код: Выделить всё

private void MyMethod()
{
List
 products = GetAllProducts(); // Get list of products
ConcurrentBag myBag = new ConcurrentBag();

//products were simply added here in the ConcurrentBag to simplify the code
//actual code process each product before adding in the bag
Parallel.ForEach(
products,
new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount },
product => myBag.Add(product));

ProcessBag(myBag); // method to process each items in the concurrentbag
}
Мои вопросы:

Правильно ли использовать ConcurrentBag? Можно ли использовать ConcurrentBag в таком сценарии?

Я думаю, что простой List и ручная блокировка подойдут лучше. Причина этого в том, что приведенный выше сценарий уже нарушает правило «один и тот же поток будет одновременно производить и потреблять данные, хранящиеся в пакете».

Кроме того, я также обнаружил, что хранилище ThreadLocal, созданное в каждом параллельном потоке, все равно будет существовать после операции (даже если поток будет повторно использоваться, верно ли это?), что может вызвать нежелательную утечку памяти.

Прав ли я в этом? один, ребята? Или достаточно простого метода очистки или пустого удаления элементов в ConcurrentBag?

Подробнее здесь: https://stackoverflow.com/questions/155 ... currentbag
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»