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.

Foi útil?

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 ().

http://msdn.microsoft.com /en-us/library/system.serviceprocess.servicebase.requestadditionaltime.aspx

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,

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