ここで以前の質問を読みました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
、並列の各スレッドで作成されたストレージは、操作後も (スレッドが再利用されたとしても) まだ存在し、望ましくないメモリ リークが発生する可能性があることもわかりました。
私はこれで正しいですか?または、単純な clear または empty メソッドでアイテムを削除するConcurrentBag
だけで十分ですか?