1

次のように宣言された辞書があります

IDictionary<string, object> _objectIds = new Dictionary<string, object>();

私はそれでいくつかの問題を経験していました.ContainsKeyメソッドの結果としてインスタンスがfalseを返したことを発見し、ウォッチウィンドウからアイテムがそこにあると確信していました. だから私はヘルパーメソッドを作成しました

private bool IdsContainsKey(string key)
{
  lock (syncObject)
  {
     lock (_objectIds)
     {
       if (_objectIds.ContainsKey(key))
         return true; // A
       if (_objectIds.ContainsKey(key))
         return true; // B
       return _objectIds.ContainsKey(key); // C
     }
  }
}

デバッグ セッション中に、メソッドが場所 B で終了し、場合によっては C に true を返す状況に遭遇しました。誰でも私を助けることができますか?ありがとう。

4

3 に答える 3

5

適切に同期していることを確認するために、lock使用するすべての場所に配置する必要があります。_objectIds

于 2010-04-25T09:46:21.350 に答える
0

lock(_objectIds)ブロックは必要ありません。また、なぜラッパー辞書を使用しているのですか?ジェネリックを使用しているのでDictionary<TKey, TValue>、独自のカスタム辞書を派生させ、そこで追跡を実装する必要があります。最後に、コードは次のように記述したほうがよいでしょう。

private bool IdsContainsKey(string key) 
{ 
   lock (syncObject) 
   {
      return _objectIds.ContainsKey(key); 
   } 
}

メソッドの結果は、として渡す値に完全に依存しますkey。発生している問題は、他の場所での誤ったロック、ラッパーディクショナリの問題、または自分が思っているキーを渡していないことが原因であると思われます。

于 2010-04-25T13:32:38.973 に答える
0

2回ロックする理由はありますか?おもう


private bool IdsContainsKey(string key)
{
  lock (syncObject)
  {
    ...
  }
}

それをする必要があります。インスタンスをそれ自体でロックすることは決して良い考えではないことをどこかで読んだのですが。

于 2010-04-25T13:01:48.993 に答える