2012-04-03 3 views
1

gewünschten WorkflowGeeignete statische Datastructure, die für den gleichzeitigen Zugriff von verschiedenen Web-Clients

  1. Zuerst möchte ich holen einen bestimmten Satz von Fragen und Antworten aus einer riesigen sicher in einer ASP.net Anwendung werden muss fädeln Reihe von Fragen und in SQL Server gespeichert Antworten (Tabellen tblQuestions und tblAnswers)

  2. Fetched Fragen und die entsprechenden Antworten werden in einer statischen Sammlung gespeichert bekommen (entweder List<Quiz> oder hashmap<key,value> wo Schlüssel Quiz Id und Wert sein wird, werden Sammlungen von Qns sein und Ans

  3. Für jede HTTP-Anfrage muss ich eine bestimmte Frage und ihre Antworten anhand einer eindeutigen QuestionId beantworten.

  4. Da viele Studenten für dasselbe Quiz eine Prüfung ablegen müssen, muss ich nicht wiederholt den gleichen Quizsatz aus der DB holen, aber wenn ein anderer Student eines anderen Streams sein Quiz beginnt, muss ich das Quiz holen er von DB und speichern sie auf dem gleiche statische Sammlung des Servers

5. Eine Reihe von Quiz wird aus der statischen Sammlung entfernt werden, sobald das Quiz durch den Administrator über oder ausgeschaltet ist.

Also im Grunde möchte ich wissen, was die geeignete Datenbankstruktur sein wird. Ich möchte mit Singletonmuster bleiben, und auch wollen, um es sicher machen Faden entweder durch Schleusen oder andere Mechanismus

Beispielmodell von Quiz

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 
} 

Jetzt will ich eigentlich einen Thread sichere Liste der Quiz erstellen wie List<Quiz>

Wie man das macht oder gibt es einen anderen sehr geeigneten Mechanismus? Ich habe keine sehr guten Kenntnisse über web-spezifische Datenstrukturen.

Eine mögliche Alternative zu einer solchen Strukturdaten folgende

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() 
    { 
    } 
} 

Antwort

1

werden kann Yo haben zwei Möglichkeiten:

1.Either den Zugriff auf die Sammlung manuell synchronisieren Sperren (und vielleicht eine Wrapper-Klasse) mit:

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 
} 

2.Or können Sie einige verwenden die neueren C# Thread-sicheren Sammlungen, wie ConcurrentBag.

+0

Ja, ich dachte auch über diese ConcurrentBag-Sammlung nach, aber eigentlich bin ich mir über die Effizienz dieser Sammlung nicht im Klaren und möchte auch wissen, ob ich meinen Workflow sehr typisch mache.Ich meine zu sagen ist Thread-Sicherheit wirklich ein Problem in dieser Art von Problem – Abhi

+0

ja Tudor Verriegelung auf diese Weise kann eine der guten Option sein, denke ich – Abhi

+1

@Abhishek Gupta: Wie Sie in Ihrer Exposition sagte, gibt es eine Möglichkeit, dass mehrere Quiz-Objekte müssen der Liste gleichzeitig hinzugefügt werden. In diesem Fall müssen Sie den Zugriff synchronisieren. – Tudor

1

Ich finde Lazy <List<T>> Questions = new Lazy<List<Questions>>(() => { //Instantiation code here }) zu einem guten Weg, um die Logik einfach und klar zu halten.

Verwandte Themen