Как правильно создать поток для ввода-вывода базы данных в веб-сервисе asmx?
У меня есть короткий защищенный раздел блокировки в методе (который полностью обслуживает запрос), который выполняет все инициализации (и т.д., связанные с журналом). Таким образом, только 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?
Заранее спасибо за ваши ответы!