我有一个字典声明如下
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。 有谁能够帮我? 感谢。
答案 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
的值。我怀疑你遇到的问题是由于其他地方的锁定不正确,你的包装词典存在问题,或者你没有传递你认为你的密钥。