Я уже читал предыдущие вопросы здесь о ConcurrentBag
, но не нашел фактического примера реализации в многопоточности.
ConcurrentBag представляет собой реалистичную реализацию пакета, оптимизированную для сценариев, где один и тот же поток будет производить и потреблять данные, хранящиеся в сумке.
В настоящее время это текущее использование в моем коде (это упрощает не фактические коды):
private void MyMethod()
{
List<Product> products = GetAllProducts(); // Get list of products
ConcurrentBag<Product> myBag = new ConcurrentBag<Product>();
//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<Product>
и ручной блокировки будут лучше. Причина этого в том, что описанный выше сценарий уже нарушает " тот же поток будет производить и потреблять данные, хранящиеся в сумке".
Также я обнаружил, что хранилище ThreadLocal
, созданное в каждом потоке в параллеле, будет существовать после операции (даже если поток используется повторно, это правильно?), Что может вызвать нежелательную утечку памяти.
Я прямо в этом парне? Или достаточно простого или чистого метода удаления элементов в ConcurrentBag
достаточно?