Was ist die korrekte Verwendung von ConcurrentBag?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Was ist die korrekte Verwendung von ConcurrentBag?

Post by Anonymous »

Ich habe hier bereits frühere Fragen zu ConcurrentBag gelesen, aber kein tatsächliches Implementierungsbeispiel für Multithreading gefunden.


ConcurrentBag ist eine Thread-sichere Bag-Implementierung, optimiert für Szenarien, in denen derselbe Thread im Bag gespeicherte Daten sowohl produziert als auch konsumiert.


Derzeit ist dies die aktuelle Verwendung in meinem Code (dies ist vereinfacht, kein tatsächlicher Code):

Code: Select all

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
}
Meine Fragen:

Ist das die richtige Verwendung von ConcurrentBag? Ist es in einem solchen Szenario in Ordnung, ConcurrentBag zu verwenden?

Ich denke, ein einfaches List
und eine manuelle Sperre sind besser geeignet. Der Grund dafür ist, dass das obige Szenario bereits gegen die Regel „Derselbe Thread wird sowohl im Beutel gespeicherte Daten produzieren als auch verbrauchen“-Regel verstößt.

Außerdem habe ich herausgefunden, dass der ThreadLocal-Speicher, der in jedem Thread parallel erstellt wurde, nach dem Vorgang immer noch vorhanden ist (selbst wenn der Thread wiederverwendet wird, stimmt das?), was zu einem unerwünschten Speicherverlust führen kann.

Liege ich damit richtig? Jungs? Oder reicht eine einfache Clear- oder Empty-Methode zum Entfernen der Elemente im ConcurrentBag aus?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post