Как правильно использовать ConcurrentBag?
Мы уже читали предыдущие вопросы здесь о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
достаточно?