2010-09-01 2 views
14

Ich erstelle einen C# .Net Windows-Dienst und frage mich, ob Sie immer base.OnStop(); in der OnStop()-Methode des Dienstes anrufen müssen und warum?Warum base.OnStop() aufrufen, wenn Windows Service gestoppt wird?

protected override void OnStop() 
{ 
    threadRunning = false; 

    this.ExitCode = 0; 
    base.OnStop(); 
} 
+1

Nicht verwandt mit Ihrer Frage, aber beachtenswert: Verwenden Sie nicht 'thread.Abort();'. – dtb

+0

@dtp, ordnungsgemäß notiert –

Antwort

12

Aus der Dokumentation auf ServiceBase.OnStop:

OnStop wird erwartet, dass in der abgeleiteten Klasse überschrieben werden. Für den Service zu nützlich sein, sollten OnStart und OnStop beide in Ihrem Dienst Klasse implementiert werden.

So wird es wirklich als eine Benachrichtigung an Ihren Dienst verwendet, dass es aufhört.

Ein Blick auf die .NET-Quellcode für ServiceBase.cs zeigt die Methode nichts tut:

protected virtual void OnStop() 
{ 
} 

So brauchen Sie es zu nennen? Nein, aber es ist immer noch eine gute Form, das zu tun. Die Basisimplementierung kann sich eines Tages ändern.

+4

Das "Gut zu nennen" Ding ist eine alberne Idee. Wenn sich die Basisimplementierung jemals geändert hat - wann nennst du es? Vor oder nach deinem eigenen Code? Zu viele Unbekannte, um zu wissen, ob man anruft oder nicht, du bist ganz auf die Dokumentation angewiesen, um die Lücken zu füllen - also, wenn der Doc dir nicht sagt, dass du anrufen sollst, würde ich mich nicht darum kümmern. IMO - die Fähigkeit, die Basismethode aufzurufen, ist eine alberne Idee, und ohne sie wäre die Sprache schöner. : p –

+6

Dies ist die implizite Kosten der Vererbung, nur gute Dokumentation kann diese Frage jemals lösen. Die ServiceBase-Klasse taumelt an der Grenze zu einer abstrakten Klasse. Mit OnStart und OnStop, die abstrakt sind, würde es kein Raten geben. –

6

Sie müssen nicht. Es bedeutet nur, dass, wenn Sie jemals eine zusätzliche Basisklasse zwischen ServiceBase und Ihrem tatsächlichen Dienst einfügen, Sie die OnStop Methode davon aufrufen, wenn es überschrieben wird. Ich glaube nicht, dass ServiceBase.OnStop selbst irgendwelche Aktionen ausführt.

Normalerweise ist es eine gute Idee, die Basismethode aufzurufen, wenn Sie IMO überschreiben, es sei denn, Sie möchten das "normale" Verhalten verhindern ... aber in diesem Fall hat das Auslassen des Anrufs keine negativen Auswirkungen.

6

Sie müssen nicht.

OnStop ist eine virtuelle Methode, die in ServiceBase definiert ist, um Ihnen eine Überschreibung zu ermöglichen, bei der Sie den Dienst stoppen können. Im (etwas) allgemeinen Fall rufen Sie beim Überschreiben einer virtuellen Methode auch die virtuelle Basismethode auf. Das einzige Mal, wenn du es nicht nennst, ist, wenn du verhindern willst, dass normale Dinge passieren.

Im Fall von Servicebase, OnStop tut nichts, so dass Sie es nicht aufrufen müssen.

2

Sie müssen diesen Anruf eigentlich nicht tätigen. Wenn Sie die OnStop-Methode in der ServiceBase-Klasse mithilfe von Reflector betrachten, werden Sie feststellen, dass sie gar nichts tut.

Verwandte Themen