BiDictionary<mystruct, int>
实施here.的变体。我还将词典类型用于ConcurrentDictionary
的firstToSecond
问题在于代码
ConcurrentDictionary firstToSecond;
public IList<TSecond> GetByFirst(TFirst first)
{
IList<TSecond> list;
var myclone=DeepCopy(firstToSecond);
var res =firstToSecond.TryGetValue(first, out list);
if (!res)
{
return EmptySecondList;
}
var doNextThing = DoNextMethod();
return new List<TSecond>(list); // Create a copy for sanity
}
有时可能会res=false
。当出现这种情况时,我自然会在Visual Studio 2015调试器中的下一个语句(var doNextThing = DoNextMethod();
)处中断以检查该值。我把mydict.TryGetValue(item, out index)
放在调试窗口和我的谜题中,现在它确实返回一个值(即:res=true
)!
调试尝试:
我确保我的密钥是理智的(它是struct
,所以它应该是一个不可变的类型,.Equals()
和.GetHashCode()
可重复,可预测事情)。
在执行mydict
操作之前,我还将myclone
深度复制到另一个对象(例如TryGetValue
)。我检查调试器中的myclone.TryGetValue(item, out index)
,它返回true!
我怀疑这是一个多线程问题,因为我的代码执行多线程处理。那么,我然后检查myDict
是否被我的代码中的其他线程修改,我发现它正在实例化并在类中使用,并且在私有方法内部(firstToSecond
是私有的)。它绝对不是可以从其他地方访问的单例,更不用说被修改了。
ConcurrentDictionary
变量使用firstToSecond
。 我的多线程调试技巧非常有限,所以我不知道如何测试多线程问题。我有什么想法可以解决这个问题吗?
这不是this question的欺骗!我知道有一个ConcurrentDictionary,但它有用吗?