Я уже читал предыдущие вопросы здесь о ConcurrentBag
, но не нашел фактического примера реализации в многопоточности.Какое правильное использование 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
?
Я думаю, что накладные расходы и общая производительность в этом случае будут больше, чем при использовании синхронного подхода. Вы это оценили? –
ConcurrentBag имеет конструктор, который принимает 'IEnumerable' 'var myBag = new ConcurrentBag (продукты);' –
Romoku
Привет, я имею в виду, что я буду по-прежнему почти таким же кодом выше, за исключением того, что я буду заменять ConcurrentBag со списком и добавьте блокировку при добавлении продукта в список внутри Parallel.ForEach –
hisoka21