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
}
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?
Mobile version