Domanda

È possibile utilizzare un UnhandledException Gestore di un Servizio di Windows?

Di norma, vorrei utilizzare un personalizzato costruito la Gestione delle Eccezioni Componente che fa la registrazione, il telefono di casa, etc.Questo componente aggiunge un gestore di Sistema.Dominio di applicazione.CurrentDomain.UnhandledException ma per quanto posso dire questo non ottenere niente di vincere un Servizio di Windows, così finisco con questo modello in mio 2 (o 4) Servizio di punti di ingresso:


    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

C'è un modo Personalizzato di Gestione delle Eccezioni componente è in grado di affrontare meglio così non devo riempire la mia OnStart con disordinato gestione delle eccezioni impianto idraulico?

È stato utile?

Soluzione

Ok, ho fatto un po ' più di ricerca in questo, ora.Quando si crea un servizio di windows in .Net, è possibile creare una classe che eredita da System.ServiceProcess.ServiceBase (In VB è nascosto nel .Designer.file di vb).Quindi ignorare OnStart e OnStop funzione, e OnPause e Sucontinue se si sceglie di.Questi metodi vengono richiamati dall'interno della classe base in modo che ho fatto un po ' rovistando con riflettore.OnStart viene richiamato da un metodo di Sistema.ServiceProcess.ServiceBase chiamato ServiceQueuedMainCallback.La vesione sulla mia macchina "del Sistema.ServiceProcess, Version=2.0.0.0" decompiles come questo:


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

Perché di Me.OnStart(arg) viene chiamato da la Prova parte di un blocco Catch Tenta presumo che tutto ciò che accade all'interno del metodo OnStart in modo efficace è avvolto da che Tenta blocco Catch e, pertanto, tutte le eccezioni che si verificano non sono tecnicamente gestita come sono effettivamente trattati nel ServiceQueuedMainCallback Try Catch.Così CurrentDomain.UnhandledException mai effettivamente accade, almeno durante la routine di avvio.Altri 3 punti di ingresso (OnStop, OnPause e Sucontinue) sono tutti chiamati dalla classe base in modo simile.

Quindi mi e ‘pensare’ che spiega perché il mio Eccezione componente di Gestione non può prendere UnhandledException su Start e Stop, ma non sono sicuro se ciò spiega perché il timer che sono l'installazione in OnStart non può causare un UnhandledException quando sparano.

Altri suggerimenti

È possibile sottoscrivere l' Dominio di applicazione.UnhandledException evento.Se si dispone di un ciclo di messaggi, è possibile legare il Applicazione.ThreadException evento.

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