1

我有一个字典声明如下

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

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

Is there a reason for locking twice? I think


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

should do it. Althought I read somewhere that it's never a good idea to lock the instance with itself.

于 2010-04-25T13:01:48.993 回答