Domanda

Esiste un modo per impostare un valore diverso per il timeout di avvio del servizio per servizio? Posso cambiarlo usando la chiave di registro ServicesPipeTimeout, ma è per macchina ( http://support.microsoft.com/ kb / 824344 ).

Al momento l'unica cosa a cui ho pensato era di fare tutte le lunghe operazioni di avvio in un thread diverso.

È stato utile?

Soluzione

È buona norma terminare di avviare il servizio il più rapidamente possibile. Quindi, durante lo stato start , fai solo ciò di cui hai assolutamente bisogno per riconoscere che è iniziato con successo; e fare il resto dopo. Se il avvio è ancora un processo lungo, utilizzare SetServiceStatus per informare periodicamente il Service Control Manager che non hai ancora finito, quindi non scade il tuo servizio.

Altri suggerimenti

Sono d'accordo con Romulo sul finire di iniziare il tuo servizio il prima possibile. Tuttavia, se hai bisogno di tempo e stai utilizzando .NET Framework 2.0 o successivo, potresti prendere in considerazione il metodo ServiceBase.RequestAdditionalTime ().

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

protected override void OnStart()
{
    this.RequestAdditionalTime(10000);
    // do your stuff
}

Fai semplicemente cose timeintensive in un altro thread

   protected override void OnStart(string[] args)
    {
        var task = new Task(() =>
        {
            // Do stuff
        });
        base.OnStart(args);
        task.Start();
    }

Ho anche avuto a che fare con un servizio che potrebbe richiedere alcuni secondi / minuti per iniziare bene. All'avvio del servizio, tenta di connettersi a un server SQL. Tuttavia, quando è stato riavviato l'intero server, il mio servizio è stato avviato PRIMA di SQL Server. (Conosco la dipendenza del servizio ma non si applica alla mia situazione per un motivo particolare ....). Ho provato a fare un ciclo provando 10 volte a connettersi a SQL Server, ma Windows stava uccidendo il mio servizio prima del secondo tentativo, a causa del timeout.

La mia soluzione : ho aggiunto un timer in " onStart () " del mio servizio. Quindi, il " onTick () " il metodo del servizio stava provando 10 volte a connettersi a SQL Server (con un'attesa di 30). Niente più timeout all'avvio.

Quindi, in sostanza,

  • Il mio servizio inizia tra 5 secondi.
  • Un timer viene avviato 10 secondi dopo il servizio iniziato.
  • Il timer prova 10 volte [aspettando 30 secondi ogni volta] per connettersi a SQL Server.
  • Se ha esito positivo, il timer si disabiliterà, in caso contrario (dopo 10 tentativi), interromperò il servizio.

Nota il modo più elegante per risolvere il problema, ma forse una parte della mia soluzione può aiutare chiunque nella stessa situazione di me,

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top