Словарь возвращает false на ContainsKey после добавления элемента - PullRequest
1 голос
/ 25 апреля 2010

У меня есть словарь, объявленный следующим образом

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

У меня возникли некоторые проблемы с ним, и он обнаружил, что экземпляр вернул false в результате метода ContainsKey, и из окна просмотра я был уверен, что элемент был там. Поэтому я создал вспомогательный метод

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. Кто-нибудь может мне помочь? Спасибо.

Ответы [ 3 ]

5 голосов
/ 25 апреля 2010

Необходимо убедиться, что вы поместили lock вокруг каждого места, которое вы используете _objectIds, чтобы убедиться, что вы синхронизируете должным образом.

0 голосов
/ 25 апреля 2010

Вам не нужен блок lock(_objectIds). Кроме того, почему вы используете словарь оболочки? Так как вы используете универсальный Dictionary<TKey, TValue>, вы должны получить свой собственный словарь и реализовать свое отслеживание там. Наконец, ваш код будет лучше написан как:

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

Результат метода будет полностью зависеть от значения, которое вы передаете как key. Я подозреваю, что проблемы, с которыми вы сталкиваетесь, связаны с неправильной блокировкой в ​​других местах, проблемой с вашим словарем-оберткой или тем, что вы не передаете ключ, которым вы себя считаете.

0 голосов
/ 25 апреля 2010

Есть ли причина для блокировки дважды? Я думаю


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

должен это сделать. Хотя я где-то читал, что закрывать экземпляр самим никогда не стоит.

...