【发布时间】:2012-08-26 15:17:57
【问题描述】:
我写了以下代码
public static class QuizSessionBL
{
#region Private Data
private static ConcurrentDictionary<int, QuizData> _data = new ConcurrentDictionary<int, QuizData>();
#endregion
#region Public Methods
public static void AddOrUpdate(QuizData pQuizData)
{
_data.AddOrUpdate(pQuizData.Quiz.QuizId, pQuizData,
(key, existingVal) =>
{
return existingVal;
});
}
public static bool Retrieve(int pQuizId, out QuizData pQuizData)
{
return _data.TryGetValue(pQuizId, out pQuizData);
}
public static void Remove(int pQuizId)
{
QuizData qd;
_data.TryRemove(pQuizId, out qd);
}
#endregion
}
我的目标是:
- 每次都向学生提供内存中的测验数据,而无需查询数据库。
- AddOrUpdate() 方法将由测验管理员在开始测验时调用
- Remove() 方法将在管理员想要关闭测验时调用。
Ex 如果 3 门课程的 30 名学生(每门课程 10 名)同时调用 Retrieve() 方法,则 _data 集合应该只有 3 个条目,每门课程一个。
所以基本上我想知道上面代码的效率,或者我应该添加更多的东西。我期待在逻辑/概念方面而不是讨论方面的答案。
【问题讨论】:
-
我不确定我是否理解。数据库访问在哪里?此代码只是并发字典的静态包装器。您是在谈论底层并发字典的性能吗?
QuizData内部线程安全吗? -
No 内部 QuizData 不是线程安全的,但是由于 ConcurrentDictionary,我们不需要关心 QuizData 的线程安全。 DB层的代码不在这里,因为这个类只是业务层的一部分,它的方法将通过UI层和数据层稍后通过某种机制被调用
-
“我们不需要关心 QuizData 的线程安全,因为 ConcurrentDictionary”是一个问题。你是说两个不同的线程不能在字典中查询相同的键?
-
ConcurrentDictionary 已经是线程安全的,我们可以将 ConcurrentDictionary 与任何线程不安全的对象一起使用以使其成为线程安全的。
-
没有。这个假设是错误的。访问字典是安全的,但访问存储的对象却不是。如果您有两个具有相同键的线程要求字典获取对象,它将返回对同一对象的引用,并且会发生不好的事情。
标签: c# asp.net multithreading concurrency parallel-processing