Создание динамических блокировок во время выполнения в ASP.NET

Допустимы ли следующие предположения для этого кода? Я поместил некоторую справочную информацию в код, но я не думаю, что она актуальна.

Assumption 1: Поскольку это одно приложение, я предполагаю, что оно будет обработано одним процессом. Таким образом, статические переменные распределяются между потоками, и статическое объявление моей коллекции объектов блокировки является допустимым.

Assumption 2: Если я знаю, что значение уже есть в словаре, мне не нужно блокировать чтение. Я мог бы использовать ConcurrentDictionary, но я считаю, что он будет безопасным, поскольку я не перечисляю (или не удаляю), и значение будет существовать и не изменится при вызовеUnlockOnValue().

Assumption 3: Я могу заблокировать коллекцию ключей, так как эта ссылка не изменится, даже если базовая структура данных изменится.

private static Dictionary<String,Object> LockList = 
    new Dictionary<string,object>();

private void LockOnValue(String queryStringValue)
{
    lock(LockList.Keys)
    {
        if(!LockList.Keys.Contains(queryStringValue))
        {
            LockList.Add(screenName,new Object());
        }
        System.Threading.Monitor.Enter(LockList[queryStringValue]);
    }
}

private void UnlockOnValue(String queryStringValue)
{
    System.Threading.Monitor.Exit(LockList[queryStringValue]);
}

Тогда я бы использовал этот код как:

LockOnValue(Request.QueryString["foo"])
//Check cache expiry
//if expired
    //Load new values and cache them.
//else
    //Load cached values
UnlockOnValue(Request.QueryString["foo"])

Background:  Я создаю приложение в ASP.NET, которое загружает данные на основе одной пользовательской переменной в строке запроса. Количество значений будет довольно ограничено. Мне нужно кэшировать результаты для каждого значения в течение определенного периода времени.

Approach: Я решил использовать локальные файлы для кэширования данных, что не является лучшим вариантом, но я хотел попробовать это, поскольку это не критично и производительность не является большой проблемой. Я использовал 2 файла для каждого варианта, один с датой истечения срока действия кэша, а другой с данными.

Issue: Я не уверен, каков наилучший способ блокировки, и я не слишком знаком с проблемами многопоточности в .NET (одна из причин, по которой я выбрал этот подход). Исходя из того, что доступно и что я прочитал, я подумал, что вышеупомянутое должно сработать, но я не уверен и хотел получить второе мнение.

Ответы на вопрос(2)

Ваш ответ на вопрос