即使VS调试器显示值存在,ConcurrentDictionary.TryGetValue也返回false

时间:2017-08-08 11:11:41

标签: c# multithreading concurrentdictionary

我有一个奇怪的情况。我使用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)!

调试尝试:

  1. 我确保我的密钥是理智的(它是struct,所以它应该是一个不可变的类型,.Equals().GetHashCode()可重复,可预测事情)。

  2. 在执行mydict操作之前,我还将myclone深度复制到另一个对象(例如TryGetValue)。我检查调试器中的myclone.TryGetValue(item, out index),它返回true!

  3. 我怀疑这是一个多线程问题,因为我的代码执行多线程处理。那么,我然后检查myDict是否被我的代码中的其他线程修改,我发现它正在实例化并在类中使用,并且在私有方法内部(firstToSecond是私有的)。它绝对不是可以从其他地方访问的单例,更不用说被修改了。

    1. 我对ConcurrentDictionary变量使用firstToSecond
  4. 我的多线程调试技巧非常有限,所以我不知道如何测试多线程问题。我有什么想法可以解决这个问题吗?

    这不是this question的欺骗!我知道有一个ConcurrentDictionary,但它有用吗?

0 个答案:

没有答案