求解C#字典dc.ContainsKey(key)为true之后,dc[key]报不存在key异常
字典结构如下:
//以下代码是在主线程中 //TryAdd全部是添加成功的 ConcurrentDictionary<string, ConcurrentDictionary<ECommandPriority, ConcurrentDictionary<string, CommandFlag>>> dcCommandList; //ECommandPriority是一个枚举。 this.dcCommandList = new ConcurrentDictionary<string, ConcurrentDictionary<ECommandPriority, ConcurrentDictionary<string, CommandFlag>>>(); if (this.dcCommandList.TryAdd(terminalPhone, new ConcurrentDictionary<ECommandPriority, ConcurrentDictionary<string, CommandFlag>>())) { if (!this.dcCommandList[terminalPhone].TryAdd(ECommandPriority.Highest, new ConcurrentDictionary<string, CommandFlag>())) { } if (!this.dcCommandList[terminalPhone].TryAdd(ECommandPriority.Normal, new ConcurrentDictionary<string, CommandFlag>())) { } if (!this.dcCommandList[terminalPhone].TryAdd(ECommandPriority.Lowest, new ConcurrentDictionary<string, CommandFlag>())) { } } else { }
下面是使用时报错代码,是在另一个线程中,在报异常时通过监视变量,发现this.dcCommandList.ElementAt(i).Value[ECommandPriority.Highest]是存在的
如果使用 TryAdd 的话,请使用 TryGet 读取。
这不是 ConcurrentDictionary 的 BUG,是你的代码逻辑有问题。
我换成TryGet确实没事了,但是为什么TryAdd是成功的,用dc[key]会出错呢
@Selway: 因为它不是线程安全方法。使用 ConcurrentDictionary 时,应该使用它提供的线程安全的方法,TryXXX 形式的方法。
这本身就是不合理的?是不是其他地方的问题,报到这了,还有是不是还有其他地方操作这个字典?
没有了,只有这两个地方,上面的只会添加,下的是使用、修改和删除
多个地方都操作了吧,导致在线程中数据不同步.最好在读写DIc的地方Lock下