在ASP.net中使用ConcurrentDictionary

时间:2012-08-26 15:17:57

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

我写了以下代码

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. Quiz Administrator在启动测验时将调用AddOrUpdate()方法
  3. 当想要关闭测验时,管理员将调用Remove()方法。
  4. Ex如果30个3门课程的学生(每个课程10个)同时调用Retrieve()方法,则_data集合应该只有3个条目,每个课程一个。

    所以基本上我想知道上面代码的效率,或者我应该为它添加更多内容。我希望在逻辑/概念而不是讨论方面给出答案。

1 个答案:

答案 0 :(得分:0)

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