c# - 提高并发字典访问效率c#

标签 c# list c#-4.0 concurrency locking

我有一个由多个后台线程访问以更新/读取的列表。更新操作包括插入和删除。

为了在没有同步问题的情况下同时执行此操作,我在类中的私有(private)只读对象上使用了锁。

为了最大限度地减少读取数据时需要锁定列表的时间,我对其进行了深度克隆并返回深度克隆并解锁字典以进行插入/删除更新。

因此,每次读取列表都会增加我的服务的内存消耗。

需要注意的一点是,插入/删除是包含列表的类的内部操作。但阅读是为了公共(public)消费。

我的问题是:

有什么办法可以避免克隆列表并仍然使用读/写锁同时使用它进行读取?

public class ServiceCache
    {
        private static List<Users> activeUsers;
        private static readonly object lockObject = new object();
        private static ServiceCache instance = new ServiceCache();

        public static ServiceCache Instance
        {
            get
            {
                return instance;
            }
        }

        private void AddUser(User newUser)
        {
            lock (lockObject)
            {
                //... add user logic
            }
        }

        private void RemoveUser(User currentUser)
        {
            lock (lockObject)
            {
                //... remove user logic
            }
        }

        public List<Users> ActiveUsers
        {
            get
            {
                lock (lockObject)
                {
                    //The cache returns deep copies of the users it holds, not links to the actual data.
                    return activeUsers.Select(au => au.DeepCopy()).ToList();
                }
            }
        }
    }

最佳答案

听起来您需要使用 ConcurrentDictionary 类,并为您存储的每个 Users 对象创建一个键。然后添加/更新用户就变得如此简单:

_dictionary.AddOrUpdate("key", (k, v) =>
    {
        return newUser;
    }, (k, v) =>
    {
        return newUser;
    });

然后要删除,您可以这样做:

 Users value = null;
_dictionary.TryRemove("key", out value);

获取人员列表也非常容易,因为您只需要执行以下操作:

return _dictionary.Values.Select(x => x.Value).ToList();

应该在那一刻返回字典内容的副本。

让 .NET 运行时为您处理线程。

关于c# - 提高并发字典访问效率c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10287141/

相关文章:

c# - 将基类中的数据合并到派生类中

c# - 如何获取生成 lambda 表达式的(源代码)字符串?

c# - 从一组 JPEG 生成 PDF

c# - DbSet.Add() 不工作

c# - EasyHook,.NET Remoting 在客户端和服务器之间共享接口(interface)?

python - 将 XML 转换为 Dict/JSON

list - 在String Dart列表中查找重复的值

python - 解压嵌套列表

c# - 博客引擎2.0错误

c# - 将普通类转换为 Web 服务类时出现 System.NotSupportedException 的原因