ConcurrentDictionary<TKey, TValue>
クラス 複数のスレッドが同時にアクセスできるキーと値のペアのスレッド セーフなコレクションを表します。
しかし、私が知っているように、System.Collections.Concurrent
クラスは PLINQ 用に設計されています。
サーバーにオンラインのクライアントを保持するものがDictionary<Key,Value>
あり、アクセスできるときにオブジェクトをロックすることでスレッドセーフにします。
私の場合、安全に置き換えることができますDictionary<TKey,TValue>
かConcurrentDictionary<TKey,TValue>
?交換したら性能は上がりますか?
この第 5 部で、Joseph Albahari は、並列プログラミング用に設計されていると述べました。
- 並行コレクションは、並列プログラミング用に調整されています。従来のコレクションは、高度な同時実行シナリオを除くすべてのシナリオで優れています。
- スレッド セーフなコレクションは、それを使用するコードがスレッド セーフであることを保証しません。
- 別のスレッドがそれを変更している間に、並行コレクションを列挙しても、例外はスローされません。代わりに、古いコンテンツと新しいコンテンツが混在しています。
- List の同時バージョンはありません。
- 並行スタック、キュー、およびバッグ クラスは、リンクされたリストを使用して内部的に実装されます。これにより、非並行の Stack および Queue クラスよりもメモリ効率が低下しますが、リンク リストはロックフリーまたは低ロックの実装に役立つため、並行アクセスには適しています。(これは、リンクされたリストにノードを挿入するには、いくつかの参照を更新するだけで済みますが、リストのような構造に要素を挿入するには、何千もの既存の要素を移動する必要がある場合があるためです。)