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:
System.ServiceProcess.ServiceBase - Si esegue l'override dei metodi dalla classe ServiceBase durante la creazione di un servizio e si definisce il codice per determinare il funzionamento del servizio in questa classe ereditata.
System.ServiceProcess.ServiceProcessInstaller e System.ServiceProcess.ServiceInstaller - Si usano queste classi per installare e disinstallare il servizio.
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 sutrue
, è possibile chiamare i metodi OnPause e OnContinue. Quando si imposta una di queste proprietà sutrue
, è quindi necessario eseguire l'override e definire l'elaborazione per i metodi associati.
È anche possibile usare un componente denominato ServiceController per comunicare con un servizio esistente e controllarne il comportamento.