2012-04-03 9 views
1

目的のワークフロー適した静的なデータ構造

  1. まず、私は巨大からの質問と回答の特定のセットを取得したいですSQL Serverの(テーブルのtblQuestionsとtblAnswers)に保存された質問と回答のセット

  2. フェッチされた質問とそれに対応する答えは、静的なコレクションに格納されます(いずれかのキーがクイズイドと値になりますList<Quiz>またはhashmap<key,value>はQNSのコレクションになりますとAns

  3. httpリクエストごとに、固有のQuestionIdに基づいて特定の質問とその回答を提供する必要があります。

  4. 多くの学生が同じクイズで試験に参加するので、同じクイズを繰り返しDBから取得する必要はありませんが、別のストリームの他の生徒がクイズを開始する場合は、クイズが終わったか、管理者がオフになったらDBから、彼と

5.サーバーの同じ静的コレクションにクイズのセットを、それを保存するには、静的なコレクションから削除されます。

基本的には、適切なデータベース構造が何であるかを知りたいと思っています。私はシングルトンパターンで残ることを望む、ともそれはクイズ

class Quiz 
{ 
    int QuizId; //QuizId 
    string QuizTitle; // Example - C# Quiz 
    List<QuestionAns> qnsAns; // List of Questiona and answers related to this Quiz 
} 

class QuestionAns 
{ 

    int QuestionId; //unique QuestionId 
    string Question; // Question Text 
    List<Answers> answers; //answers to this question (can be more than one) 
} 

class Answer 
{ 
    int AnswerId; //unique AnswerId 
    string Answer;//Answer Text 
    bool isRight;//Is this Answer right 
} 

の例モデル

ロックを介して、または任意の他のメカニズムのいずれかのスレッドセーフにしたい今、私は実際にクイズのスレッドセーフリストを作成したいですlike List<Quiz>

これを実行する方法や他の多くの適切なメカニズムがありますか?私はWebアプリケーション固有のデータ構造に関する非常に良い知識を持っていません。

ヨは、2つのオプションがあり

public sealed class Singleton 
{ 
    private static readonly Lazy<Singleton> lazy = 
     new Lazy<Singleton>(() => new Singleton()); 

    public static Singleton Instance { get { return lazy.Value; } } 

    private Singleton() 
    { 
    } 
} 

答えて

1

次することができるようなデータ構造の一つの可能​​な代替:

1.Either手動ロックを使用してコレクションにアクセス(そしておそらくラッパークラス)を同期します。あなたはのいくつかを使用することができます2.Or

public class ThreadSafeList 
{ 
    private List<Quiz> list = new List<Quiz>(); 
    private object locker = new object(); 

    private static ThreadSafeList instance = new ThreadSafeList(); 

    private ThreadSafeList() { } 

    public static GetInstance() 
    { 
     return instance; 
    } 

    public void Add(Quiz q) 
    { 
     lock(locker) list.Add(q); 
    } 

    // whatever else you need to synchronize 
} 

新しいC#スレッドセーフなコレクション(ConcurrentBagなど)。

+0

はい私はこのConcurrentBagコレクションについても考えましたが、実際には私はこのコレクションの効率性を認識しておらず、ワークフローを非常に典型的なものにしているかどうかも知りたいと思います。私は、スレッドセーフティーは本当にこのタイプの問題の問題であると言うことを意味します。 – Abhi

+0

はいこの方法でのチューダーのロックは、私が思う良いオプションの1つになります。 – Abhi

+1

@Abhishek Gupta:あなたの展覧会で述べたように、 Quiz'オブジェクトを同時にリストに追加する必要があります。この場合、アクセスを同期させる必要があります。 – Tudor

1

私はLazy <List<T>> Questions = new Lazy<List<Questions>>(() => { //Instantiation code here })がロジックを簡単かつ明確に保つ良い方法であることがわかりました。