qual é o caminho certo para gerar thread para o banco de dados IO no serviço web asmx?

Eu tenho uma seção protegida de bloqueio curto em um método (que atende a solicitação inteiramente) que faz todas as inicializações (etc. relacionadas ao log). Então, apenas 1 thread pode estar lá no momento. Nesta seção, também carrego dados do sistema do banco de dados, se não estiverem carregados. Isto é naturalmente executado apenas na primeira requisição e não importa se leva tempo e nenhum encadeamento pode se propagar, já que é feito apenas uma vez (por solicitação fictícia).

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

Após a seção protegida por bloqueio, os dados do sistema são acessados ​​a partir de encadeamentos simultâneos somente por leitura e nenhum bloqueio é necessário:

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

Agora, a seção protegida por bloqueio deve ter um método que verifique se os dados do sistema são mais antigos que 24h e atualize-os. Se for feito apenas pelo método de chamada (da seção protegida por bloqueio) abaixo, o encadeamento leva muito tempo e nenhum outro encadeamento pode entrar na seção protegida por bloqueio.

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

Minhas perguntas são:

Como gerar uma maneira melhor do segmento não-threadpool para manipular o E / S para que o thread de trabalho do threadpool possa se propagar e todos os threads gastem o mínimo de tempo na seção protegida por bloqueio?

É o _allData = newData; em LoadAllSystemData atomic? Se estiver, parece ser a melhor maneira de implementar isso, portanto, métodos GetXxx como GetTables não precisam de nenhum bloqueio!

Existe alguma maneira de obter LoadAllSystemData para ser chamado antes das solicitações? Por exemplo, no iisreset?

Agradecemos antecipadamente por suas respostas!

questionAnswers(2)

yourAnswerToTheQuestion