it-swarm.com.de

Windows-Dienst-Startzeitlimit

Gibt es eine Möglichkeit, einen anderen Wert für das Zeitlimit für den Start des Dienstes pro Dienst festzulegen? Ich kann es mithilfe des Registrierungsschlüssels ServicesPipeTimeout ändern, aber es ist pro Computer ( http://support.Microsoft.com/kb/824344 ).

Im Moment dachte ich nur daran, alle zeitaufwändigen Startaktionen in einem anderen Thread durchzuführen.

51
Meidan Alon

Es empfiehlt sich, den Start Ihres Dienstes so schnell wie möglich zu beenden. Tun Sie also während des Startzustands nur das, was Sie unbedingt benötigen, um zu bestätigen, dass der Start erfolgreich war. und den Rest später erledigen. Wenn der Start immer noch langwierig ist, verwenden Sie SetServiceStatus regelmäßig, um den Service zu informieren Control Manager , den Sie noch nicht fertiggestellt haben, damit Ihr Dienst nicht abläuft.

36
Rômulo Ceccon

Ich bin mit Romulo einverstanden, dass der Dienst so bald wie möglich beginnt. Wenn Sie jedoch die erforderliche Zeit benötigen und .NET Framework 2.0 oder höher verwenden, sollten Sie die ServiceBase.RequestAdditionalTime () -Methode in Betracht ziehen.

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

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

Mach einfach zeitintensive Sachen in einem anderen Thread

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

Ich musste mich auch mit einem Service befassen, der einige Sekunden/Minuten dauern kann, um einen guten Start zu haben. Wenn der Dienst gestartet wird, versucht er, eine Verbindung zu einem SQL Server herzustellen. Beim Neustart des gesamten Servers wurde mein Dienst jedoch VOR SQL Server gestartet. (Ich kenne die Dienstabhängigkeit, aber sie trifft aus einem bestimmten Grund nicht auf meine Situation zu.) Ich habe 10 Mal versucht, eine Schleife zu starten, um eine Verbindung zu SQL Server herzustellen, aber Windows hat meinen Dienst vor dem zweiten Versuch aufgrund des Timeouts beendet.

Meine Lösung: Ich habe einen Timer im "onStart ()" meines Dienstes hinzugefügt. Dann hat die "onTick ()" - Methode des Dienstes 10 Mal versucht, eine Verbindung zum SQL Server herzustellen (mit einer Wartezeit von 30 Minuten). Kein Timeout mehr beim Start.

Also im Grunde genommen,

  • Mein Dienst startet in 5 Sekunden.
  • Ein Timer wird 10 Sekunden nach dem Start des Dienstes gestartet.
  • Der Timer versucht zehnmal [jedes Mal 30 Sekunden warten], eine Verbindung zum SQL Server herzustellen.
  • Wenn dies erfolgreich ist, deaktiviert sich der Timer von selbst. Wenn dies nicht der Fall ist (nach 10 Versuchen), stoppe ich den Dienst.

Beachten Sie die elegantere Art, das Problem zu lösen, aber vielleicht hilft ein Teil meiner Lösung jemandem in der gleichen Situation wie ich.

1
Simon