Является ли этот фрагмент кода, где я блокирую часть функции правильно? Или он может использовать недостатки, когда несколько сеансов одновременно запрашивают один и тот же экзамен?
Цель состоит в том, чтобы клиент, который первым запросит экзамен, собрал его, все последующие клиенты получат кэшированную версию.
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];
}
У меня такое ощущение, что это не способ сделать это.