UnhandledException handler in a .Net Windows Service

前端 未结 2 2069
谎友^
谎友^ 2020-12-16 10:27

Is it possible to use an UnhandledException Handler in a Windows Service?

Normally I would use a custom built Exception Handling Component that does logging, phone h

相关标签:
2条回答
  • 2020-12-16 11:05

    Ok, I’ve done a little more research into this now. When you create a windows service in .Net, you create a class that inherits from System.ServiceProcess.ServiceBase (In VB this is hidden in the .Designer.vb file). You then override the OnStart and OnStop function, and OnPause and OnContinue if you choose to. These methods are invoked from within the base class so I did a little poking around with reflector. OnStart is invoked by a method in System.ServiceProcess.ServiceBase called ServiceQueuedMainCallback. The vesion on my machine "System.ServiceProcess, Version=2.0.0.0" decompiles like this:

    
    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 because Me.OnStart(args) is called from within the Try portion of a Try Catch block I assume that anything that happens within the OnStart method is effectively wrapped by that Try Catch block and therefore any exceptions that occur aren't technically unhandled as they are actually handled in the ServiceQueuedMainCallback Try Catch. So CurrentDomain.UnhandledException never actually happens at least during the startup routine. The other 3 entry points (OnStop, OnPause and OnContinue) are all called from the base class in a similar way.

    So I ‘think’ that explains why my Exception Handling component can’t catch UnhandledException on Start and Stop, but I’m not sure if it explains why timers that are setup in OnStart can’t cause an UnhandledException when they fire.

    0 讨论(0)
  • 2020-12-16 11:28

    You can subscribe to the AppDomain.UnhandledException event. If you have a message loop, you can tie to the Application.ThreadException event.

    0 讨论(0)
提交回复
热议问题