Верны ли следующие предположения для этого кода? Я разместил некоторую справочную информацию под кодом, но я не думаю, что это уместно.
Предположение 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 (— это одна из причин, по которой я выбрал этот подход ). Основываясь на том, что доступно и что я прочитал, я подумал, что вышеизложенное должно работать, но я не уверен и хотел узнать второе мнение.