gpt4 book ai didi

c# - 可以使用 ConcurrentDictionary 进行一对多映射吗?

转载 作者:行者123 更新时间:2023-11-30 12:36:26 26 4
gpt4 key购买 nike

我有一个映射,其中每个键都可以有多个关联值。我认为 ConcurrentDictionary 可能会帮助我更轻松地编写此 map 的代码以便在多线程环境中使用,但这些方法似乎是围绕单个值构建的。我看到 AddOrUpdate() 允许我修改该值(如果它已经存在),但它不保证该操作的原子性,所以它看起来毫无意义?有没有人有解决这种情况的好策略?

对不起,我想我有点含糊。我想要一个键有多个值,即有一个与键关联的 IList。但我希望能够以安全的方式从多值中添加/删除值。如果同时多次调用 AddOrUpdate + delegate 方法,它看起来可能会导致事情丢失?

最佳答案

看起来 AddOrUpdateTryUpdate 都可以工作。

编辑

我可能错了。如果是的话,我觉得文档说的不够清楚,还是直接看代码吧。由反射器提供:

public TValue AddOrUpdate(TKey key, Func<TKey, TValue> addValueFactory, Func<TKey, TValue, TValue> updateValueFactory)
{
TValue local;
TValue local3;
if (key == null)
{
throw new ArgumentNullException("key");
}
if (addValueFactory == null)
{
throw new ArgumentNullException("addValueFactory");
}
if (updateValueFactory == null)
{
throw new ArgumentNullException("updateValueFactory");
}
do
{
if (!this.TryGetValue(key, out local3))
{
TValue local2;
local = addValueFactory(key);
if (!this.TryAddInternal(key, local, false, true, out local2))
{
continue;
}
return local2;
}
local = updateValueFactory(key, local3);
}
while (!this.TryUpdate(key, local, local3));
return local;
}

现在,如果更新工厂获取一个现有列表并返回一个带有附加成员的新列表,在我看来它确实是原子的。在竞争条件的情况下,失败者将简单地再次调用他们的更新工厂。我错了吗?

关于c# - 可以使用 ConcurrentDictionary 进行一对多映射吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3311552/

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