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

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

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

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

Успенская 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"])

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

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

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

8
задан Kendrick 24 July 2012 в 13:48
поделиться