1

我写了以下代码

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() 方法。

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

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

4

1 回答 1

0

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

于 2012-08-27T14:17:01.580 回答