Как правильно создать поток для ввода-вывода базы данных в веб-сервисе 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?

Заранее спасибо за ваши ответы!

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

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