さて、奇妙な小さな問題に直面しており、率直に言って、アイデアがありません。私はこれをそこに捨てて、何か間違ったことを見逃していないか、または ConcurrentDictionary が正しく機能していないかどうかを確認したかったのです。コードは次のとおりです。
(キャッシュは、静的な 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>();
}