2010-05-31 7 views
6

Tengo un servicio de Windows que ejecuta BackgroundWorker, y me pregunto si estoy haciendo lo correcto cuando detenga mi servicio de Windows.Cómo desechar a BackgroundWorkers de la manera correcta

¿Es suficiente:

  1. Deje el BackgroundWorker1_DoWork método completo (tengo un bucle while en ella ahora, haciendo algunas tareas)
  2. Establecer la variable que contiene la referencia a la BackgroundWorker, a null

¿hay algún tipo de método Dispose() necesito llamar (de la misma manera la clase Timer tiene Timer.Dispose();)?

+3

Ver http: // stackoverflow.com/questions/1755597/c-do-i-need-to-dispose-a-backgroundworker-created-at-runtime –

+0

posible duplicado de [Forma correcta de deshacerse de un BackGroundWorker] (http://stackoverflow.com/questions/2542326/proper-way-to-dispose-of-a-backgroundworker) –

Respuesta

1

Francamente, cuando detiene su servicio de Windows, realmente no importa. Su proceso de win32 finaliza, por lo que no es estrictamente necesario para limpiar sus IDisposables. Todos los recursos no administrados tendrán un finalizador que se ejecutará.

Dicho esto, es normal tener un empleado de segundo nivel que se deshace cuando lo hace la clase de servicio. No es necesario, pero siempre es bueno estar limpio.

+0

Cuando detiene un servicio de Windows, el SCM (Administrador de control de servicios) llamará a su interfaz Stop y esperará un período de tiempo predeterminado antes de que lo mate: Creo que son 15 segundos por defecto. En este momento, puede cerrar su servicio limpiamente. –

-1

El método correcto es dejar que el trabajador enhebre limpiamente lo que está haciendo.

Esto a menudo se puede hacer teniendo una bandera compartida \ waithandle \ lo que se puede usar para comunicar al hilo del trabajador (del hilo principal) que debe salir de lo que está haciendo, lo que naturalmente conducirá al trabajador hilo arrastrando los pies de su pila y evaporándose. El hilo de trabajo debe verificar regularmente la "bandera" para ver si necesita salir (por ejemplo, en el ciclo), y el hilo de servicio principal puede señalar el indicador cuando deba cerrarse. El hilo principal luego espera a que salga el hilo de trabajo, p. llamando a join en el hilo de trabajo.

-1

BackgroundWorker es IDisposable, por lo que debe deshacerse de él cuando ya no lo necesite.

BackgroundWorkers también tienen un método CancelAsync que cambia la propiedad CancellationPending a verdadero. Puede verificar eso en su función DoWork para que pueda evitar que se ejecute.

1

Dado que BackgroundWorker implementa IDisposable, debe deshacerse de él cuando haya terminado con él.

Menciona que esto es un servicio de Windows, por lo que hay algunas cosas que entran en juego aquí. Cuando detiene un servicio de Windows, obtiene alrededor de 30 segundos para regresar del método OnStop en su implementación ServiceBase. Si no regresa dentro de este tiempo, Windows informa al usuario que no pudo detener el servicio. Lo que debe hacer es indicarle al BackgroundWorker que necesita detenerlo (utilizando el mecanismo CancelAsync), desechar al trabajador y luego salir. Sin embargo, dado que está deteniendo el servicio, realmente no importa como , todo el proceso terminará de todos modos, incluidos los hilos que se están ejecutando dentro de él.

Si hizo lo que dice y espera a que el trabajador complete (en el método OnStop), su servicio puede parecerle al usuario como si se hubiera colgado, ya que Windows dirá que no puede detenerlo, y proceso todavía se ejecutará.

Cuestiones relacionadas