7

ConcurrentDictionary の AddOrUpdate メソッドを基本的に使用して、同時コレクションとスレッド化で問題に直面しています.....私はそれを使用することができません..良い例を見つけることができませんでした...また、できませんでしたMSDN プログラミング ガイドの ConcurrentQueue の例を完全には理解していません。


基本的に ConcurrentDictionary の AddOrUpdate メソッド.....私はそれを使用することができません..良い例を見つけることができませんでした...そして完全に理解できませんでした.MSDNプログラミングガイドのConcurrentQueueの例..

4

1 に答える 1

29

通常の辞書では、次のようなコードが表示される場合があります。

Dictionary<string, int> dictionary = GetDictionary();

if (dictionary.ContainsKey("MyKey"))
{
    dictionary["MyKey"] += 5;
}
else
{
    dictionary.Add("MyKey", 5);
}

これはスレッドセーフなコードではありません。複数の競合状態があります。"MyKey" は への呼び出し後に追加/削除される可能性がありContainsKey、"MyKey" に関連付けられた値 (存在する場合) は、+=演算子を使用して行の読み取りと代入の間で変更される可能性があります。

このメソッドは、キーが存在するかどうかに応じて、特定のキーに関連付けられた値を追加またはAddOrUpdate更新するメカニズムを提供することにより、これらのスレッド化の問題を解決することを目的としています。これは、複数の操作 (この場合、キーをチェックし、キーの存在に応じて値を挿入または変更する) を組み合わせて、競合状態の影響を受けない 1 つの効果的なアトミック アクションにするという点で似ています。TryGetValue

これを具体的にするために、 を使用して上記のコードを修正する方法を次に示しますAddOrUpdate

ConcurrentDictionary<string, int> dictionary = GetDictionary();

// Either insert the key "MyKey" with the value 5 or,
// if "MyKey" is already present, increase its value by 5.
dictionary.AddOrUpdate("MyKey", 5, (s, i) => i + 5);
于 2011-01-03T13:48:22.767 に答える