¿Cuál es la forma correcta de generar subprocesos para la base de datos de E / S en el servicio web de asmx?

Tengo una sección protegida de bloqueo corto en un método (que atiende la solicitud por completo) que realiza todas las inicializaciones (etc. relacionadas con el registro). Así que solo 1 hilo puede estar ahí a la vez. En esta sección también cargo datos del sistema de la base de datos si no están cargados. Esto se ejecuta de forma natural solo en la 1ª solicitud y no importa que lleve tiempo y que los subprocesos no se puedan propagar, ya que solo se realiza una vez (por solicitud ficticia).

    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;
    }

Después de la sección protegida por bloqueo, se accede a los datos del sistema desde subprocesos concurrentes solo mediante la lectura y no se necesitan bloqueos:

    static public Hashtable GetTables()
    {
        return _allData.Tables;
    }

Ahora, la sección protegida por bloqueo debe tener un método que verifique si los datos del sistema son más antiguos que las 24 horas y los actualiza. Si se hace simplemente llamando al método (de la sección de bloqueo protegido) debajo de ese hilo, lleva mucho tiempo y ningún otro hilo puede ingresar a la sección de bloqueo protegido.

   static public void CheckStatus()
   {
       DateTime timeStamp = DateTime.Now;
       TimeSpan span = timeStamp.Subtract(_cacheTimeStamp);
       if (span.Hours >= 24)
       {
           LoadAllSystemData();
           _cacheTimeStamp = DateTime.Now;
       }
    }

Mis preguntas son:

¿Cómo generar un subproceso sin subprocesos la mejor manera de manejar IO para que el subproceso de trabajo de subprocesos se pueda propagar y todos los subprocesos pasen un tiempo mínimo en la sección protegida de bloqueo?

Es el _allData = newData; en LoadAllSystemData atomic? Si es así, se siente la mejor manera de implementarlo, por lo que los métodos GetXxx como GetTables no necesitan ningún bloqueo.

¿Hay alguna forma de que se llame a LoadAllSystemData antes de las solicitudes? Por ejemplo en iisreset?

¡Gracias de antemano por sus respuestas!