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. 毎回クエリ DB を使用せずにメモリ内のクイズ データを生徒に提供する。
  2. AddOrUpdate() メソッドは、クイズの開始時にクイズ管理者によって呼び出されます。
  3. Remove() メソッドは、管理者がクイズを閉じたいときに呼び出されます。

例 3 コースの 30 人の学生 (各コースの 10 人) が Retrieve() メソッドを同時に呼び出す場合、_data コレクションは各コースに 1 つずつ、3 つのエントリのみを持つ必要があります。

したがって、基本的には上記のコードの効率を知りたい、またはさらに何かを追加する必要があります。議論ではなく、論理/概念の観点からの回答を期待しています。

4

1 に答える 1

0

あなたの例は、辞書に同じIDを持つアイテムが1つしかないという点で見栄えがします。ただし、 ConcurrentDictionary は、追加/削除がスレッドセーフであることを確認するだけです。2 人の学生が同じ QuizData オブジェクトを取得してそれを変更すると、各 QuizData オブジェクト内/周囲にスレッドセーフがない限り、お互いに上書きされます。

于 2012-08-27T14:17:01.580 に答える