ConcurrentDictionary - неверный словарь или плохой код?

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