在C#.NET中查看函数的锁定部分

Lie*_*oen 0 asp.net caching

这段代码是我锁定函数的一部分是正确的吗?或者,当多个会话同时要求同一个考试时,它是否会有使用缺点?

目的是首先要求考试的客户端将组装它,所有下一个客户端将获得缓存版本.

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)

我觉得这不是这样做的方法.

Ode*_*ded 5

永远不要锁定字符串 - 它们是不可变的并且是实体的,所以当试图在其他地方访问相同的字符串时,最终可能会锁定整个应用程序.

只需使用新object的锁:

private readonly object Padlock = new object();
Run Code Online (Sandbox Code Playgroud)

请参阅Tess Ferrandez撰写的这篇博客文章.