janelas de tempo limite de inicialização do serviço
-
03-07-2019 - |
Pergunta
Existe uma maneira de definir um valor diferente para tempo limite serviço de inicialização por serviço? Eu posso mudá-lo usando a chave de registo ServicesPipeTimeout, mas é por máquina ( http://support.microsoft.com/ kb / 824344 ).
No momento, a única coisa que eu pensava era para fazer todas as ações de inicialização demoradas em um segmento diferente.
Solução
É uma boa prática ao fim de iniciar o seu serviço o mais rápido possível. Assim, durante o start estado, fazer apenas o que é absolutamente necessário para reconhecê-lo iniciado com êxito; e fazer o resto mais tarde. Se o start ainda é um processo demorado, use SetServiceStatus periodicamente para informar o service Control Manager que você ainda não ter terminado, por isso não limite de tempo seu serviço.
Outras dicas
Eu concordo com Romulo em terminar para começar a seu serviço o mais rápido possível. No entanto, se você precisa do tempo e você estiver usando o .NET Framework 2.0 ou posterior, você pode considerar método ServiceBase.RequestAdditionalTime ().
protected override void OnStart()
{
this.RequestAdditionalTime(10000);
// do your stuff
}
Simplesmente fazer coisas timeintensive em outro segmento
protected override void OnStart(string[] args)
{
var task = new Task(() =>
{
// Do stuff
});
base.OnStart(args);
task.Start();
}
Eu também teve de lidar com um serviço que pode demorar alguns segundos / minutos para ter um bom começo. Quando o serviço é iniciado, ele tenta se conectar a um SQL Server. No entanto, quando todo o servidor foi reiniciado, o meu serviço foi começando antes do SQL Server. (Eu sei sobre a dependência de serviço mas dont aplica a minha situação por um motivo especial ....). Eu tentei fazer um loop tentar 10 vezes para se conectar ao SQL Server, mas o Windows estava matando o meu serviço antes da segunda tentativa, por causa do tempo limite.
Minha solução : Eu adicionei um temporizador no "onStart ()" do meu serviço. Em seguida, o "onTick ()" método do serviço estava tentando 10 vezes para se conectar ao SQL Server (com uma espera de 30 em-lo). Não mais Timeout na inicialização.
Então, basicamente,
- O meu serviço começa em 5 segundos.
- Um temporizador é iniciado 10 segundos após o serviço é começado.
- O timer tenta 10 vezes [de esperar 30 segundos cada vez] para conectar-se ao SQL Server.
- Se bem sucedido, o temporizador irá desativar-se, se não (após 10 try), eu parar o serviço.
Observe a maneira mais elegante para resolver o problema, mas talvez alguma parte da minha solução pode ajudar alguém na mesma situação que eu,