Frage

Ist es möglich, einen UnhandledException Handler in einem Windows-Dienst zu benutzen?

Normalerweise würde ich eine benutzerdefinierte gebaut Exception Handling Komponenten verwenden, die Protokollierung der Fall ist, nach Hause telefonieren, usw. Diese Komponente einen Handler System.AppDomain.CurrentDomain.UnhandledException fügt aber soweit ich dies zu erreichen ist sagen kann nichts ein gewinnen Windows-Dienst so beende ich mit diesem Muster in meinem 2 (oder 4) Service Einspeisepunkten bis:


    Protected Overrides Sub OnStart(ByVal args() As String)
        ' Add code here to start your service. This method should set things
        ' in motion so your service can do its work.
        Try
            MyServiceComponent.Start()
        Catch ex As Exception
            'call into our exception handler
            MyExceptionHandlingComponent.ManuallyHandleException (ex)
            'zero is the default ExitCode for a successfull exit, so if we set it to non-zero
            ExitCode = -1
            'So, we use Environment.Exit, it seems to be the most appropriate thing to use
            'we pass an exit code here as well, just in case.
            System.Environment.Exit(-1)
        End Try
    End Sub

Gibt es eine Möglichkeit, meine Gewohnheit Exception Handling-Komponente mit diesem so besser umgehen kann ich meine OnStart mit unordentlichen Ausnahmebehandlung Klempner nicht füllen?

War es hilfreich?

Lösung

Ok, ich habe jetzt ein wenig mehr Forschung in getan. Wenn Sie einen Windows-Dienst in .NET erstellen, erstellen Sie eine Klasse, die von System.ServiceProcess.ServiceBase erbt (In VB wird dies in der .Designer.vb Datei versteckt). Sie überschreiben dann die OnStart und OnStop Funktion und OnPause und OnContinue wenn Sie zu wählen. Diese Verfahren sind aus der Basisklasse aufgerufen, damit ich ein wenig Stossen mit Reflektor um tat. OnStart wird durch ein Verfahren aufgerufen in System.ServiceProcess.ServiceBase ServiceQueuedMainCallback genannt. Die vesion auf meinem Rechner "System.ServiceProcess, Version = 2.0.0.0" dekompiliert wie folgt aus:


Private Sub ServiceQueuedMainCallback(ByVal state As Object)
    Dim args As String() = DirectCast(state, String())
    Try 
        Me.OnStart(args)
        Me.WriteEventLogEntry(Res.GetString("StartSuccessful"))
        Me.status.checkPoint = 0
        Me.status.waitHint = 0
        Me.status.currentState = 4
    Catch exception As Exception
        Me.WriteEventLogEntry(Res.GetString("StartFailed", New Object() { exception.ToString }), EventLogEntryType.Error)
        Me.status.currentState = 1
    Catch obj1 As Object
        Me.WriteEventLogEntry(Res.GetString("StartFailed", New Object() { String.Empty }), EventLogEntryType.Error)
        Me.status.currentState = 1
    End Try
    Me.startCompletedSignal.Set
End Sub

So weil Me.OnStart (args) aus dem Try Teil eines Try Catch-Block genannt wird Ich gehe davon aus, dass alles, was in der OnStart Methode geschieht effektiv durch diese Catch-Block Versuchen gewickelt ist und daher Ausnahmen irgendwelchen, die auftreten, sind nicht technisch nicht behandelte, wie sie tatsächlich im ServiceQueuedMainCallback Try-Catch behandelt werden. So CurrentDomain.UnhandledException nie passiert eigentlich zumindest während der Startroutine. Die anderen drei Einspeisepunkte (OnStop, OnPause und OnContinue) sind alle von der Basisklasse in ähnlicher Weise bezeichnet.

Also Ich denke ", die erklärt, warum meine Exception Handling-Komponente nicht UnhandledException auf Start und Stopp fangen, aber ich bin nicht sicher, ob es erklärt, warum Timer, die Einrichtung in OnStart sind, können keine UnhandledException verursachen, wenn sie Feuer .

Andere Tipps

Sie können auf die abonnieren AppDomain.UnhandledException Ereignis . Wenn Sie eine Meldung Schleife haben, können Sie auf die

scroll top