私はDictionary<object1, List<object2>
(もう少し複雑な、私の構造のために作成した抽象化)を持っています。
ディクショナリ内のリストは非並列コンテキストで初期化されますが、リストに新しい要素を追加するには、スレッドセーフなメソッドが必要です。アイテムの削除は発生しません(ディクショナリオブジェクトはトランザクションの最後に破棄されます)。また、キーと値のペアは初期化時にのみ追加されるため、作業中にキーが追加またはディクショナリから削除されることはなく、値のみが更新されます。
同時コレクションを使用できません。古い.NETFrameworkでスタックしています。
最初は、辞書全体を。でロックしましたReadWriteSlimlock
。まあ、これはパフォーマンス的には非常に悪いものでした。多くの加算操作が行われていて、それらは別の操作を待つだけです。少なくとも私は各キーに対して並行して作業を行っているため、各リストのみをロックする方がはるかに優れたソリューションです。また、追加操作は単純list.Add(object2)
ではありません。追加時にスレッドセーフ領域で他の複雑な操作を実行する必要があります。
しかし、私はそれを実装するための最良の方法が何であるかわかりません:
lock(dictionary.Value)
?ReadWriteSlimlock
(キーごとに1つ)の辞書を使用しますか?- 他のより良い解決策はありますか?