私は方法があります。IDictionaryをとる関数にConcurrentDictionary型を渡すことは安全ですか?
void foo(IDictionary<string, object> data) {
data["key1"] = getValue1();
data["key2"] = getValue2();
}
を次のように私は現在、それを呼び出す:辞書が複数のスレッドに移入されているので
var serialDict = new Dictionary<string, object>();
foo(serialDict);
は今、私はConcurrentDictionary
タイプでfoo
を呼び出す必要があります。
var concurrentDict = new Dictionary<string, object>();
foo(concurrentDict);
ConcurrentDictionary
がIDictionary
を実装しているので、私はfoo
メソッドのシグネチャを変更する必要はありません。そして、変更は私のマシン上で正常に動作するようです。
しかし、同じ方法/方法で正規の辞書と並行して辞書を作成することができないということは、私にはうまくいきません。
安全なことは何ですか?
なぜそれがOKでないのか分かりません。 Concurrent Dictによると、IDictionaryはどこでも使用できます。つまり、そのインタフェースを実装することで可能です。 – pm100
どのような操作の下で「安全」ですか?あなたのプログラムは、それらのキーをあるスレッドに追加し、別のスレッドでそれらから読み込みますか?あなたは、読者が作家の後で実行するように注文する必要がありますか?それらの不変量はあなたのコードによって維持されていないからです。コンカレントディクショナリ**は競合状態でプロセスをクラッシュさせることはありません**しかし、それはあなたのプログラムが自動的に正しい*ことを意味するものではありません!辞書を静かに保つコードを書いていない限り、*常に変化する*として辞書を扱う必要があります。 –
@EricLippert同じキーではなく、注文手順があります。他のスレッドはキーを追加または編集しますが、このメソッドではキーを追加または編集しません。 – AngryHacker