Un servizio scritto in .NET può essere auto-terminato?

Ho un’applicazione di servizio scritta in C # e in determinate circostanze, vorrei che si interrompesse da sola. Ciò accadrebbe dopo che il servizio è stato in esecuzione per un po ‘, quindi questo non sarebbe accaduto nell’evento OnStart ().

Tutto ciò che ho letto finora suggerisce che l’unico modo sicuro per terminare un servizio è attraverso il Service Control Manager. Il mio servizio funziona come servizio locale e non ha i diritti per avviare o interrompere i servizi, quindi non posso accedere a SCM dal servizio stesso. C’è un altro modo per auto-terminare mentre continua a giocare secondo le regole del SCM?

Prova ServiceBase.Stop() .

Se si desidera interrompere il servizio anziché interromperlo (forse perché il servizio ha rilevato un’eccezione altrimenti non gestita), è ansible utilizzare Environment.Exit(1) (utilizzare un altro codice di uscita se lo si desidera).

Windows scoprirà che il servizio è stato interrotto in modo imprevisto. Se il servizio è stato configurato per il ripristino, verrà utilizzata la procedura di ripristino che include le opzioni per riavviare il servizio, eseguire un programma o riavviare il computer.

Cosa succede se lasci terminare tutti i thread in esecuzione? Posso immaginare tre possibili risultati:

  • L’SCM rileva e decide di aver terminato in modo appropriato
  • L’SCM nota, pensa che sei morto e ti riavvia
  • L’SCM non si accorge e mostra che è ancora in esecuzione

EDIT: Sospetto che questa risposta sia la migliore, ma lascerò tutto ciò (per il momento) solo per motivi di interesse.

Non eseguire il servizio in Servizio locale. Hanno eseguito sotto un utente che ha i diritti per interrompere un servizio.

Sebbene l’idea di servizi auto-terminanti non sia la migliore delle idee. Solo questo fatto indica che dovrebbe essere un’applicazione e non un servizio.