У меня есть короткий защищенный раздел блокировки в методе (который полностью обслуживает запрос), который выполняет все инициализации (и т. Д., Связанные с журналом). Таким образом, только 1 поток может быть там одновременно. В этом разделе я также загружаю системные данные из базы данных, если они не загружены. Естественно, это выполняется только по первому запросу, и не имеет значения, что это занимает время, и никакие потоки не могут распространяться, поскольку это делается только один раз (по фиктивному запросу).
static public void LoadAllSystemData()
{
SystemData newData = new SystemData(); //own type (etc. Hashtables in Hashtables).
LoadTables(ref newData);
LoadClasses(ref newData);
LoadAllSysDescrs(ref newData);
LoadFatFields(ref newData);
LoadAllFields(ref newData);
_allData = newData;
}
После раздела, защищенного блокировкой, системные данные доступны из параллельных потоков только путем чтения, и блокировки не требуются:
static public Hashtable GetTables()
{
return _allData.Tables;
}
Теперь в разделе, защищенном блокировкой, должен быть метод, который проверяет, старше ли системные данные, чем 24 часа, и обновляет их. Если это было сделано просто путем вызова метода (из секции, защищенной блокировкой) ниже, этот поток занимает много времени, и никакой другой поток не может войти в секцию, защищенную блокировкой.
static public void CheckStatus()
{
DateTime timeStamp = DateTime.Now;
TimeSpan span = timeStamp.Subtract(_cacheTimeStamp);
if (span.Hours >= 24)
{
LoadAllSystemData();
_cacheTimeStamp = DateTime.Now;
}
}
Мои вопросы:
Как создать поток, не являющийся пулом потоков, лучшим способом обработки ввода-вывода, чтобы рабочий поток пулов потоков мог распространяться, и все потоки проводили минимальное время в защищенной секции блокировки?
Является ли _allData = newData; в LoadAllSystemData атомарный? Если это так, то это лучший способ реализовать это, поэтому методы GetXxx, такие как GetTables, не нуждаются в блокировке!
Есть ли способ получить LoadAllSystemData для вызова перед запросами? Например на iisreset?
Заранее спасибо за ваши ответы!