Architettura di programmazione delle applicazioni di servizio

Nota

Questo articolo non si applica ai servizi ospitati in .NET. Per i contenuti più recenti sui servizi Windows che usano Microsoft.Extensions.Hosting.BackgroundService e il modello worker service, vedere:

Le applicazioni di servizio Windows sono basate su una classe che eredita dalla classe System.ServiceProcess.ServiceBase. Eseguire l'override dei metodi da questa classe e definirne le funzionalità per determinare il comportamento del servizio.

Le classi principali coinvolte nella creazione del servizio sono:

Inoltre, una classe denominata ServiceController può essere usata per modificare il servizio stesso. Questa classe non è coinvolta nella creazione di un servizio, ma può essere usata per avviare e arrestare il servizio, passare comandi al servizio e restituire una serie di enumerazioni.

Definizione del comportamento del servizio

Nella classe del servizio si esegue l'override delle funzioni della classe di base, che determinano ciò che accade quando lo stato del servizio cambia in Gestione controllo servizi. La classe ServiceBase espone i metodi seguenti, di cui è possibile eseguire l'override per aggiungere comportamenti personalizzati.

metodo Override per
OnStart Indicare quali azioni devono essere eseguite all'avvio del servizio. È necessario scrivere codice in questa procedura per fare eseguire operazioni utili al servizio.
OnPause Indicare le azioni da eseguire quando il servizio viene sospeso.
OnStop Indicare le azioni da eseguire in caso di arresto del servizio.
OnContinue Indicare le azioni da eseguire quando il servizio riprende il normale funzionamento dopo una sospensione.
OnShutdown Indicare le azioni da eseguire appena prima della chiusura del sistema, se il servizio è sempre in esecuzione.
OnCustomCommand Indicare le azioni da eseguire quando il servizio riceve un comando personalizzato. Per altre informazioni sui comandi personalizzati, vedere MSDN online.
OnPowerEvent Indicare come deve rispondere il servizio quando viene ricevuto un evento di risparmio energia, ad esempio la batteria in esaurimento o la sospensione del sistema.

Nota

Questi metodi rappresentano gli stati che assume il servizio durante il ciclo di vita. Il servizio passa da uno stato al successivo. Ad esempio, il servizio non risponderà mai a un comando OnContinue prima della chiamata di OnStart.

Esistono vari altri metodi e proprietà interessanti. tra cui:

  • Metodo Run nella classe ServiceBase. Questo è il punto di ingresso principale per il servizio. Quando si crea un servizio usando il modello Servizio Windows, il codice viene inserito all'interno del metodo Main dell'applicazione per eseguire il servizio. Il codice è simile al seguente:

    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[]
        { new Service1() };
    Run(ServicesToRun);
    
    Dim ServicesToRun() As System.ServiceProcess.ServiceBase
    ServicesToRun =
        New System.ServiceProcess.ServiceBase() {New Service1()}
    System.ServiceProcess.ServiceBase.Run(ServicesToRun)
    

    Nota

    Questi esempi usano una matrice di tipo ServiceBase, in cui è possibile aggiungere ogni servizio contenuto dall'applicazione, in modo che tutti i servizi possano poi essere eseguiti insieme. Se si crea solo un singolo servizio, tuttavia, è possibile scegliere di non usare la matrice e dichiarare semplicemente un nuovo oggetto che eredita da ServiceBase e quindi eseguirlo. Per un esempio, vedere Procedura: Scrivere servizi a livello di codice.

  • Una serie di proprietà per la classe ServiceBase. Queste proprietà determinano i metodi che possono essere chiamati per il servizio. Ad esempio, quando la proprietà CanStop è impostata su true, è possibile chiamare il metodo OnStop sul servizio. Quando la proprietà CanPauseAndContinue è impostata su true, è possibile chiamare i metodi OnPause e OnContinue. Quando si imposta una di queste proprietà su true, è quindi necessario eseguire l'override e definire l'elaborazione per i metodi associati.

    Nota

    Il servizio deve eseguire l'override almeno di OnStart e OnStop per essere utile.

È anche possibile usare un componente denominato ServiceController per comunicare con un servizio esistente e controllarne il comportamento.

Vedi anche