- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用并发字典的 GetOrAdd 方法来检索值列表,然后引用我正在编辑的值列表。这样做是线程安全的吗?
第一种方法是添加一个值,第二种方法是清除列表。
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;
using Test.Web.Services;
namespace Test.Web.Messaging
{
public class Dispatch
{
private static readonly ConcurrentDictionary<string, IList<Message>> Messages = new ConcurrentDictionary<string, IList<Message>>();
public static void AddMessage(string id, Message value)
{
var msgs = Messages.GetOrAdd(id, new List<Message>());
msgs.Add(value);
}
public static void Send(string id)
{
var msgs = Messages.GetOrAdd(id, new List<Message>());
foreach (var msg in msgs)
{
Connection.Send(id, msg);
}
msgs.Clear();
}
}
}
最佳答案
字典不为存储的值提供保护。它唯一管理的是确保键到值的映射保持一致。您仍然需要使用适当的锁定来保护存储的对象的数据。
关于c# - ConcurrentDictionary 在 GetOrAdd 之后编辑值是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23374624/
下面哪两段代码在不同情况下表现更好,为什么? 1。 private readonly ConcurrentDictionary> _coll; _coll.GetOrAdd(1, new List()
我想将 GetOrAdd 之类的东西与 ConcurrentDictionary 一起用作网络服务的缓存。这本词典有异步版本吗? GetOrAdd 将使用 HttpClient 发出 Web 请求,因
我正在使用 ConcurrentDictionary 来缓存并行访问的数据,有时新项目可以存储在数据库中,但它们不会加载到缓存中。这就是我使用 GetOrAdd 的原因 public User Get
ConcurrentDictionary.GetOrAdd(TKey, Func)接受工厂函数以允许将项目的延迟实例化放入字典中。 定义一个本身调用 GetOrAdd() 的工厂函数是否安全,即在“父
这个问题在这里已经有了答案: Async call within synchronous function (1 个回答) 关闭 5 年前。 我正在考虑使用 ConcurrentDictionary
我有几个使用 ConcurrentDictionary 的案例用于缓存值,但通常我需要执行值验证以决定是否使用 ConcurrentDictionary.GetOrAdd(TKey, Func) 将其
我正在使用并发字典的 GetOrAdd 方法来检索值列表,然后引用我正在编辑的值列表。这样做是线程安全的吗? 第一种方法是添加一个值,第二种方法是清除列表。 using System.Collecti
考虑这段代码: void DoSomething(int key) { concurrentDictionary.GetOrAdd(key, (k)=> {
问题:我需要实现对象缓存。缓存需要是线程安全的并且需要按需填充值(延迟加载)。这些值是通过 Key 的 Web 服务检索的(操作缓慢)。所以我决定使用 ConcurrentDictionary 及其
我有一个 ConcurrentDictionary: private static ConcurrentDictionary _cd = new ConcurrentDictionary(); 保守地
我试图通过为一些非常核心的功能引入缓存层来减轻我的数据库服务器的工作,这些功能将值插入数据库中的表并检索 ID。这是在多线程环境中。 我的第一个方法是: public class Cache {
我正在使用并发字典来保存打开的文件。 要打开一个新文件,我这样做: myDictionary.GetOrAdd (fName, (fn) => new StreamWriter(fn, true));
我注意到 GetOrAdd() 总是执行工厂委托(delegate),即使值存在于字典中也是如此。例如: class Program { private static ConcurrentDi
The bottom of this article描述了使用 GetOrAdd 如何导致(如果我理解正确的话)损坏/意外结果。 剪断/ ConcurrentDictionary is designe
我将并发字典用作线程安全的静态缓存并注意到以下行为: 来自 the MSDN docs on GetOrAdd : If you call GetOrAdd simultaneously on dif
在.NET Framework 中,有Dictionary 和ConcurrentDictionary。这些方法提供了Add、Remove 等方法... 我知道当我们设计一个多线程程序时,我们使用Co
ConcurrentDictionary 的文档没有明确说明,所以我想我们不能期望委托(delegate) valueFactory 和 updateValueFactory 同步执行(分别来自 Ge
我是一名优秀的程序员,十分优秀!