我需要一些帮助来了解线程安全和词典。当添加到字典时,我收到一条错误,说“已经添加了一个具有相同密钥的项目”(当我说我得到它时,我实际上无法复制它,但已在错误日志中看到它)。
从阅读类似问题时我可以看到它可能与线程安全有关,但我仍然不清楚发生了什么。因为它很难测试,特别是当我无法复制时,我希望有人能够解释或指出我正确的方向。这是一个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
答案 0 :(得分:1)
由于您的MyQuizDataAdapter
方法被完全不恰当地命名,您只会创建一个的Create
实例 - 它不会“创建”适配器,它会返回每次都是一样的!
每次创建一个不同的,你至少会处于更好的位置......不可否认,我不太喜欢每次调用GetQuiz
时重新填充测验的方式{ {1}},但那是另一个步骤......