添加项目后,Dictionary在ContainsKey上返回false

时间:2010-04-25 09:42:23

标签: c# dictionary containskey

我有一个字典声明如下

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。 有谁能够帮我? 感谢。

3 个答案:

答案 0 :(得分:5)

您需要确保在使用lock的每个地方放置_objectIds,以确保正确同步。

答案 1 :(得分:0)

有两次锁定的原因吗?我想


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

应该这样做。虽然我在某处读到了将实例与自己锁定在一起并不是一个好主意。

答案 2 :(得分:0)

您不需要lock(_objectIds)块。另外,为什么使用包装器字典?由于您使用的是通用Dictionary<TKey, TValue>,因此您应该派生自己的自定义词典并在那里实施跟踪。最后,您的代码可以更好地编写为:

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

该方法的结果将完全取决于您传递给key的值。我怀疑你遇到的问题是由于其他地方的锁定不正确,你的包装词典存在问题,或者你没有传递你认为你的密钥。