好吧,所以我遇到了一个奇怪的小问题,坦率地说我没有想法。我想把它扔出去,看看我是否遗漏了我做错的事情,或者 ConcurrentDictionary 是否工作不正常。这是代码:
(Cache 是一个包含静态 ConcurrentDictionary Keys 的类)
var tmp = Cache.Keys.GetOrAdd(type,
key =>
{
var keys = context.GetKeys(key);
if (keys.Count() == 1)
{
return new KeyInfo
{
Name = keys.First().Name,
Info = key.GetInfo(keys.First().Name)
};
}
return null;
});
if (tmp == null)
Cache.Keys.TryRemove(type, out tmp);
return tmp;
问题是偶尔tmp
会null
导致TryRemove
线路运行,但return null;
上面的线路从未被击中。既然这return null
是唯一放入null
字典的东西,而且它永远不会运行,那怎么可能tmp
呢null
?
包括 Cache 类(此代码不使用 SetNames):
public class Cache
{
public static ConcurrentDictionary<Type, Info> Keys = new ConcurrentDictionary<Type, Info>();
public static ConcurrentDictionary<Type, string> SetNames = new ConcurrentDictionary<Type, string>();
}