Подходящая статическая DataStructure, которая должна быть поточно-ориентированной в приложении ASP.net для одновременного доступа от различных веб-клиентов - PullRequest
1 голос
/ 03 апреля 2012

Требуемый рабочий процесс

  1. Сначала я хочу получить определенный набор вопросов и ответов из огромного набора вопросов и ответов, хранящихся в SQL Server (таблицы tblQuestions и tblAnswers)

  2. Выбранные вопросы и соответствующие ответы будут храниться в статической коллекции (либо List<Quiz>, либо hashmap<key,value>, где ключом будет Id викторины, а значением будут коллекции Qns и Ans

  3. Для каждого запроса http я должен предоставить конкретный вопрос и его ответы на основе уникального идентификатора QuestionId.

  4. Поскольку многие учащиеся сдают экзамен для одного и того жетогда мне не нужно извлекать один и тот же набор тестов из БД, но если какой-то другой ученик другого потока начинает его / ее тест, мне нужно получить его для него из БД и сохранить его в той же статической коллекции сервера

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
}

Теперь я действительно хочу создать потокбезопасный список викторины, как List<Quiz>

Как это сделать, или есть какой-то другой подходящий механизм?Я не очень хорошо разбираюсь в структурах данных, специфичных для веб-приложений.

Одной из возможных альтернатив такой структуре данных может быть следующий

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

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Я считаю Lazy <List<T>> Questions = new Lazy<List<Questions>>(() => { //Instantiation code here }) хорошим способом сохранить логику простой и ясной.

1 голос
/ 03 апреля 2012

У вас есть два варианта:

1. Либо синхронизируйте доступ к коллекции вручную, используя блокировки (и, возможно, класс-оболочку):

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. Или вы можете использовать некоторые из более новых поточно-безопасных коллекций C #, например ConcurrentBag .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...