gpt4 book ai didi

c# - ConcurrentDictionary - 损坏的字典或错误的代码?

转载 作者:太空狗 更新时间:2023-10-29 23:33:43 32 4
gpt4 key购买 nike

好吧,所以我遇到了一个奇怪的小问题,坦率地说,我没有想法。我想把它扔出去看看我是否遗漏了我做错的东西,或者 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;

问题是偶尔 tmpnull,导致 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>();
}

最佳答案

tmp 如果您从 context.GetKeys(key) 中获取的不是单个项目集,则可以为 null。在这种情况下,keys.Count() != 1,一个空项将插入到指定键的 Cache.Keys 中(并从 GetOrAdd 返回,并赋值给tmp)。

编辑:刚想到另一种可能性。什么数据类型是关键?它是某种自定义类吗?看起来是这样。如果是这样,您是否正确实现了 EqualsGetHashcode

关于c# - ConcurrentDictionary - 损坏的字典或错误的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8750524/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com