gpt4 book ai didi

c# - ConcurrentDictionary.AddOrUpdate() : Add value to list on update

转载 作者:行者123 更新时间:2023-11-30 17:50:43 25 4
gpt4 key购买 nike

我正在使用 ConcurrentDictionary<String,List<String>> .我想使用 AddOrUpdate方法,如果某个键的列表已经存在,则该值将添加到值列表中。由于我提供给 AddOrUpdate 的功能方法需要返回一个列表,我想我想这样做:

public void AddValue( String key, String value)
{
_dictionary.AddOrUpdate( key, new List<string> { value},
( k, oldValue ) => UpdateValueList( oldValue, value) );
}

private List<String> UpdateValueList( List<String> list, String value)
{
if ( !list.Contains( value) )
{
list.Add( value);
}
return list;
}

这是处理这种情况的好方法,还是我应该做些不同的事情?

最佳答案

鉴于您使用的是 ConcurrentDictionary我假设您正在寻找线程安全的解决方案。您的解决方案不是线程安全的,因为 List<T>类不是线程安全的。

要创建线程安全的解决方案,您需要确保同步对 List<T> 的所有访问从您的类(class)内部上课,并确保您永远不会在您的类(class)之外公开该列表(如果需要,您需要克隆它)。

如果不进一步了解您要实现的目标,就很难做到更精确。

更新

只是提供一个关于缺乏线程安全的例子。

  • 考虑调用您的 AddOrUpdate 方法的两个线程之间的竞争条件。

  • ConcurrentDictionary在运行 addValueFactory 时不持有锁和 updateValueFactory方法。这是一个通用的设计原则:在调用外部代码时不要持有锁,因为这会导致包括重入在内的各种问题。

  • 因此两个线程可以运行 UpdateValueList方法并发使用相同的输入列表,这不是线程安全的。

如果您将对列表的每次访问都包装在一个锁中,它可能会成为线程安全的,但我需要查看您的类的其余代码才能确定。

关于c# - ConcurrentDictionary.AddOrUpdate() : Add value to list on update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20385783/

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