ключ уже добавлен для словаря - проблема потока? - PullRequest
0 голосов
/ 21 февраля 2011

Мне нужна помощь, чтобы разобраться с безопасностью потоков и словарями. При добавлении в словарь я получаю сообщение об ошибке: «Элемент с тем же ключом уже добавлен» (когда я говорю, что получаю его, я фактически не смог повторить это, но увидел его в журналах ошибок).

Из того, что я вижу при чтении подобных вопросов, скорее всего, это связано с безопасностью потоков, но я до сих пор не понимаю, что происходит. И так как это сложно проверить, особенно когда я не могу воспроизвести это, я надеюсь, что кто-то сможет объяснить или указать мне правильное направление. Это веб-приложение asp.net (C #), и ошибка возникает при получении теста, адаптированного для конкретного пользователя. Я также получаю ошибки, пытаясь получить доступ к ключам, которые не существуют, но по одной за раз!

Я сделал мини-пример, где я вычеркнул все, что, по моему мнению, не было необходимо, чтобы показать проблему. Если я слишком много раздену, дай мне знать.

public class QuizDataAdapterFactory
{
    private static IQuizDataAdapter q_adapter = new MyQuizDataAdapter();

    public static IQuizDataAdapter Create()
    {
        return q_adapter;
    }
}

IQuizDataAdapter dataAdapter = QuizDataAdapterFactory.Create();

public class MyQuizDataAdapter : IQuizDataAdapter
{
    private Quiz quiz;

    public Quiz GetQuiz()
    {
        quiz = new Quiz();
        quiz.QuestionIndex = new Dictionary<Guid, QuestionBase>();

        GetQuestions();

        return quiz;
    }

    private void GetQuestions()
    {
        Item[] items;

        foreach (Item questionItem in items)
        {
            Question newQuestion = new Question();
            PopulateQuestionFromItem(newQuestion, questionItem);
            questions.Add(newQuestion);

            // this is where it fails
            quiz.QuestionIndex.Add(questionItem.ID.ToGuid(), newQuestion);
        }
    }
}

Сможет ли добавить [ThreadStatic] для IQuizDataAdapter?

Спасибо

Annelie

1 Ответ

1 голос
/ 21 февраля 2011

Вы только когда-либо создаете один экземпляр MyQuizDataAdapter из-за того, что ваш Create метод совершенно неуместно назван - он не "создает" адаптер, он каждый раз возвращает один и тот же!

Вместо этого каждый раз создавайте новый, и вы, по крайней мере, будете в лучшем положении ... по общему признанию, мне не очень нравится, как каждый раз, когда вы звоните GetQuiz, он снова заполняет теств MyQuizDataAdapter тоже, но это еще один шаг ...

...