web-dev-qa-db-ja.com

ConcurrentDictionary.TryAddが失敗することはありますか?

これは学問的な質問ですが、 ConcurrentDictionary.TryAdd 失敗することはありますか?もしそうなら、どのような場合に、なぜですか?

62
Dave Lawrence

はい、できます、ここに条件があります( msdn ):

  • ArgumentNullException-キーがnull参照の場合
  • OverflowException-要素の最大数に達したとき
  • 同じキーを持つ要素が既に存在する場合、falseを返します

繰り返しますが、これは並行性とは関係ありません。 2つのスレッドが同時にアイテムを挿入することを心配する場合、次のことが起こります。

  • キーが異なる場合、両方の挿入が正常に機能します。
  • 1つの挿入は正常に機能してtrueを返し、もう1つの挿入は失敗し(例外なし)、falseを返します。これは、2つのスレッドが同じキーを持つアイテムを挿入しようとして、基本的に1つだけが勝ち、もう1つが失う場合に発生します。
91
oleksii

もちろんできます。キーが既に存在する場合、メソッドはfalseを返します。

参照: http://msdn.Microsoft.com/en-us/library/dd267291.aspx

戻り値の型:System.Booleanキー/値のペアがConcurrentDictionaryに正常に追加された場合はtrue。 キーがすでに存在する場合、このメソッドはfalseを返します。

7
Chris Gessler

キーが辞書に既に存在する場合、失敗します。

メモリが不足しているために値を追加できない場合は、代わりに例外が発生します。

2
Guffa