这段代码是我锁定函数的一部分是正确的吗?或者,当多个会话同时要求同一个考试时,它是否会有使用缺点?
目的是首先要求考试的客户端将组装它,所有下一个客户端将获得缓存版本.
public Exam GetExamByExamDto(ExamDTO examDto, int languageId)
{
Log.Warn("GetExamByExamDto");
lock (LockString)
{
if (!ContainsExam(examDto.id, languageId))
{
Log.Warn("Assembling ExamDto");
var examAssembler = new ExamAssembler();
var exam = examAssembler.createExam(examDto);
if (AddToCache(exam))
{
_examDictionary.Add(examDto.id + "_" + languageId, exam);
}
Log.Warn("Returning non cached ExamDto");
return exam;
}
}
Log.Warn("Returning cached ExamDto");
return _examDictionary[examDto.id + "_" + languageId];
}
Run Code Online (Sandbox Code Playgroud)
我觉得这不是这样做的方法.
永远不要锁定字符串 - 它们是不可变的并且是实体的,所以当试图在其他地方访问相同的字符串时,最终可能会锁定整个应用程序.
只需使用新object
的锁:
private readonly object Padlock = new object();
Run Code Online (Sandbox Code Playgroud)
请参阅Tess Ferrandez撰写的这篇博客文章.
归档时间: |
|
查看次数: |
70 次 |
最近记录: |