2010-09-01 17 views
14

Estoy creando un servicio Windows de C# .Net y me pregunto si siempre tiene que llamar al base.OnStop(); en el método OnStop() del servicio y por qué?¿Por qué llamar a base.OnStop() cuando se detiene el servicio de Windows?

protected override void OnStop() 
{ 
    threadRunning = false; 

    this.ExitCode = 0; 
    base.OnStop(); 
} 
+1

No relacionado con su pregunta, pero vale la pena mencionar: No use 'thread.Abort();'. – dtb

+0

@dtp, debidamente anotado –

Respuesta

12

De la documentación sobre ServiceBase.OnStop: Se espera que

OnStop que se reemplaza en la clase derivada. Para que el servicio a sea útil, OnStart y OnStop deben ser ambos implementados en su clase de servicio .

Por lo tanto, se usa realmente como notificación a su servicio para que se detenga.

Un vistazo al código fuente de .NET para ServiceBase.cs revela el método no hace nada:

protected virtual void OnStop() 
{ 
} 

Por lo tanto, no es necesario llamar a él? No. Pero sigue siendo una buena forma de hacerlo. La implementación base puede cambiar algún día.

+4

Lo del "bueno para llamarlo" es una idea tonta. Si la implementación base alguna vez cambió, ¿cuándo la llamas? ¿Antes o después de tu propio código? Demasiadas incógnitas para saber si debe llamar o no, usted está completamente informado sobre la documentación para llenar los vacíos, así que a menos que el médico le diga que lo llame, no me molestaría. OMI: la capacidad de llamar al método base es una idea tonta y el lenguaje sería más agradable sin él. : p –

+6

Este es el costo implícito de la herencia, solo una buena documentación puede resolver esta pregunta. La clase ServiceBase está a punto de tener que haber sido diseñada como una clase abstracta. Con OnStart y OnStop siendo abstractos, no habría dudas. –

6

No es necesario. Simplemente significa que si alguna vez inserta una clase base adicional entre ServiceBase y su servicio real, llamará al método OnStop para eso, si se reemplaza. No creo que ServiceBase.OnStop realice ninguna acción.

Por lo general, es una buena idea llamar al método base cuando está anulando IMO, a menos que específicamente desee evitar el comportamiento "normal" ... pero en este caso, omitir la llamada no tendrá ningún efectos dañinos.

6

No es necesario.

OnStop es un método virtual definido en ServiceBase para permitirle una anulación donde puede manejar la detención del servicio. En el caso (algo) general, cuando anula un método virtual, también llama al método virtual base. La única vez que no lo llamas es cuando quieres evitar que sucedan las cosas normales.

En el caso de Servicebase, OnStop no hace nada por lo que no es necesario que lo llame.

2

En realidad, no tiene que hacer esa llamada. Si observa el método OnStop en la clase ServiceBase utilizando Reflector, verá que no hace nada en absoluto.

Cuestiones relacionadas