【问题标题】:Using ConcurrentDictionary in ASP.net在 ASP.net 中使用 ConcurrentDictionary
【发布时间】:2012-08-26 15:17:57
【问题描述】:

我写了以下代码

public static class QuizSessionBL
    {
        #region Private Data

        private static ConcurrentDictionary<int, QuizData> _data = new ConcurrentDictionary<int, QuizData>();

        #endregion

        #region Public Methods

        public static void AddOrUpdate(QuizData pQuizData)
        {
            _data.AddOrUpdate(pQuizData.Quiz.QuizId, pQuizData,
            (key, existingVal) =>
            {
                return existingVal;
            });
        }

        public static bool Retrieve(int pQuizId, out QuizData pQuizData)
        {
            return _data.TryGetValue(pQuizId, out pQuizData);
        }

        public static void Remove(int pQuizId)
        {
            QuizData qd;
            _data.TryRemove(pQuizId, out qd);
        }

        #endregion
    }

我的目标是:

  1. 每次都向学生提供内存中的测验数据,而无需查询数据库。
  2. AddOrUpdate() 方法将由测验管理员在开始测验时调用
  3. Remove() 方法将在管理员想要关闭测验时调用。

Ex 如果 3 门课程的 30 名学生(每门课程 10 名)同时调用 Retrieve() 方法,则 _data 集合应该只有 3 个条目,每门课程一个。

所以基本上我想知道上面代码的效率,或者我应该添加更多的东西。我期待在逻辑/概念方面而不是讨论方面的答案。

【问题讨论】:

  • 我不确定我是否理解。数据库访问在哪里?此代码只是并发字典的静态包装器。您是在谈论底层并发字典的性能吗? QuizData 内部线程安全吗?
  • No 内部 QuizData 不是线程安全的,但是由于 ConcurrentDictionary,我们不需要关心 QuizData 的线程安全。 DB层的代码不在这里,因为这个类只是业务层的一部分,它的方法将通过UI层和数据层稍后通过某种机制被调用
  • “我们不需要关心 QuizData 的线程安全,因为 ConcurrentDictionary”是一个问题。你是说两个不同的线程不能在字典中查询相同的键?
  • ConcurrentDictionary 已经是线程安全的,我们可以将 ConcurrentDictionary 与任何线程不安全的对象一起使用以使其成为线程安全的。
  • 没有。这个假设是错误的。访问字典是安全的,但访问存储的对象却不是。如果您有两个具有相同键的线程要求字典获取对象,它将返回对同一对象的引用,并且会发生不好的事情。

标签: c# asp.net multithreading concurrency parallel-processing


【解决方案1】:

您的示例看起来不错,因为字典中只有 1 个具有相同 ID 的项目。但是 ConcurrentDictionary 只会确保添加/删除是线程安全的。如果两个学生获得相同的 QuizData 对象并对其进行修改,他们将相互覆盖,除非每个 QuizData 对象内/周围都有线程安全性。

【讨论】:

  • 1.学生不会修改 QuizData 对象。 2. 当我从集合中提取一个项目时,我将通过复制(克隆)它而不是获取原始项目的参考来获取。
猜你喜欢
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多