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
Мобильная версия