Pergunta

Eu tenho um aplicativo ASP.NET que dispara alguns trabalhadores em segundo plano usando threadpool.queueUserworkItem (). Na maioria das vezes, haverá zero threads de fundo em execução, mas é possível que ocasionalmente haja até 5-6 executando por vez. Além disso, a maioria será concluída em alguns segundos, mas é possível que eles possam correr por até 10 minutos.

Dados todos os diferentes cenários que podem causar um desligamento de um aplicativo ASP.NET, gostaria de ter esses processos em segundo plano, saindo de graciosamente, se possível, quando o aplicativo precisar desligar e eles estão no meio do processamento.

Não prevê ter um problema demais para criar uma maneira de sinalizar os processos para interromper seu trabalho mais cedo e limpar dentro de alguns segundos para obter a chamada de que o aplicativo está sendo desligado. Embora se alguém tenha conselhos específicos sobre isso, eu certamente apreciaria.

Minhas duas perguntas principais são:

1) Quando seria o tempo apropriado para dizer aos trabalhadores do fundo para encerrar as coisas. Durante o Application_end? Descarte ()? Ou talvez uma terceira opção que eu não esteja ciente.

2) Se eu esperar durante o evento acima para que os processos terminem antes de retornar, há um ponto em que não ter o retorno do Application_END imediatamente pode causar problemas mais sérios para o aplicativo do que não desligar bem os trabalhos em segundo plano.

void Application_End(object sender, EventArgs e) 
{
    //if this for whatever reason takes a non-trivial time to execute, what problems could I encounter? 
    SignalBackgroundJobsAndWaitForThemToShutDown();
}

Obrigado!

Foi útil?

Solução

O tempo apropriado está no APLICAÇÃO_END

Agora, depois de sinalizar seus trabalhos de fundo, você deve esperar por eles naquele momento para terminar e depois deixar continuar, como parece que você faz.

Tenha no meu, é bom colocar um tempo na espera, não espere por sempre, caso contrário, sua piscina pode ter problemas ou desligar, então você precisa verificar sua configuração de piscina no máximo. Espere para desligar a piscina. Um valor maior que a sua espera ou apenas desativou.

Também tenha no meu que, se você tiver jardim da piscina (mais de 1 pools de trabalho), o Application_end é chamado uma vez para cada piscina.

Eu uso a mesma técnica em meus sites, da mesma maneira que sinalizo meus fios para parar da mesma maneira, também registro o final final e verifico quando eles são finais finais, e também forço minhas rotinas a parar e não deixá -las Corra por muitos tempo. O application_end é chamado em reciclar o pool ou quando você abre o arquivo app_offline.htm ou quando você vai fechar o serviço da web. Pessoalmente, desabilito as reciclas, não preciso delas e apenas abro o app_offline.htm quando faço atualizações. Naquele momento, espero meus tópicos da piscina para parar o trabalho deles.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top