键已添加为字典 - 线程问题?

时间:2011-02-21 16:45:37

标签: c# .net dictionary thread-safety

我需要一些帮助来了解线程安全和词典。当添加到字典时,我收到一条错误,说“已经添加了一个具有相同密钥的项目”(当我说我得到它时,我实际上无法复制它,但已在错误日志中看到它)。

从阅读类似问题时我可以看到它可能与线程安全有关,但我仍然不清楚发生了什么。因为它很难测试,特别是当我无法复制时,我希望有人能够解释或指出我正确的方向。这是一个asp.net Web应用程序(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);
        }
    }
}

为IQuizDataAdapter添加[ThreadStatic]会不会这样做?

谢谢,

Annelie

1 个答案:

答案 0 :(得分:1)

由于您的MyQuizDataAdapter方法被完全不恰当地命名,您只会创建一个Create实例 - 它不会“创建”适配器,它会返回每次都是一样的!

每次创建一个不同的,你至少会处于更好的位置......不可否认,我不太喜欢每次调用GetQuiz时重新填充测验的方式{ {1}},但那是另一个步骤......