Domanda

Sto scrivendo una serie di servizi Windows. Voglio che falliscano se vengono lanciati errori durante l'avvio (nel metodo OnStart () ). Avevo supposto che semplicemente lanciare un errore in OnStart () avrebbe fatto questo, ma sto scoprendo che invece "Inizia". e mi presenta un messaggio indicante " Il servizio è stato avviato, ma è inattivo. È corretto? & Quot; (Parafrasi). Come gestisco l'errore in modo che non riesca effettivamente ad avviare il servizio?

È stato utile?

Soluzione

se si utilizza .NET 2.0 o versioni successive, è possibile utilizzare ServiceBase.Stop per interrompere il servizio da OnStart. Altrimenti chiama Stop da un nuovo thread.

ref [devnewsgroups] ( http: / /www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic50404.aspx )

(gruppo di notizie scomparso)

Altri suggerimenti

Se la cosa principale che desideri è che la finestra Servizi segnali che si è verificato un errore, da quello che ho provato (.net 3.5 su Windows 7), l'unico modo per farlo è impostare ExitCode. Ti consiglio di impostarlo su 13816, poiché questo porta al messaggio, "Si è verificato un errore sconosciuto." Vedi i codici di errore di Windows .

Il seguente esempio realizza tre cose. 1 - l'impostazione ExitCode genera un messaggio utile per l'utente finale. Non influisce sul registro dell'applicazione di Windows ma include un messaggio nel registro di sistema. 2 - La chiamata di Stop comporta un "Servizio arrestato correttamente" messaggio nel registro dell'applicazione. 3 - il lancio dell'eccezione si traduce in una voce di registro utile nel registro dell'applicazione.

protected override void OnStart(string[] args) {

  try {
    // Start your service
  }
  catch (Exception ex) {
    // Log exception
    this.ExitCode = 13816;
    this.Stop();
    throw;
  }

}

Sposta tutta la tua logica di avvio in un metodo separato e genera eccezioni (o chiama OnStop) da quel metodo separato.

OnStart presenta alcune stranezze all'avvio. Ho scoperto che se OnStart () non contiene più di una riga, non visualizzo " Il servizio è stato avviato e quindi interrotto. Alcuni servizi si arrestano automaticamente se non hanno lavoro da eseguire " messaggio e le eccezioni generate interromperanno il processo e accederanno al registro eventi dell'app.

Anche con il metodo di avvio separato, è possibile utilizzare una tecnica come questa per eseguire il debug senza collegarsi. http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx

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