Хорошо, поэтому я столкнулся со странной маленькой проблемой и, честно говоря, у меня нет идей.Я хотел показать это, чтобы увидеть, что я упустил что-то, что я сделал неправильно, или ConcurrentDictionary работает неправильно.Вот код:
(Cache - это класс, содержащий статические ключи ConcurrentDictionary)
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>();
}