Pregunta

Given a System.Timers.Timer, ¿hay una manera desde el hilo principal para saber si el hilo trabajador que ejecuta el código de evento transcurrido todavía se está ejecutando?

En otras palabras, ¿cómo puede uno asegurarse de que el código que se ejecuta en el subproceso de trabajo no se esté ejecutando antes de detener el temporizador o de la aplicación principal / hilo de servicio en el que se está ejecutando el temporizador?

¿Es esto una cuestión de deshacerse del Temporizador para el temporizador de subprocesos que usa el estado, o es solo el momento de usar los subprocesos directamente?

¿Fue útil?

Solución

Busque ManualResetEvent, ya que está hecho para hacer específicamente lo que está pidiendo.

Sus subprocesos crean un nuevo evento de restablecimiento y lo agregan a una cola accesible que su subproceso principal puede usar para ver si todavía hay subprocesos en ejecución.

// main thread owns this
private List<ManualResetEvent> _resetEvents;
...
// main thread does this to wait for executing threads to finish
WaitHandle.WaitAll(_resetEvents.ToArray(), 2000, false)
...
// worker threads do this to signal the thread is done
myResetEvent.Set();

Puedo darle más código de muestra si lo desea, pero básicamente lo copié de los dos artículos que leí cuando tuve que hacer esto hace aproximadamente un año.


Olvidó mencionar, no puede agregar esta funcionalidad a los subprocesos predeterminados que obtendrá cuando se active el temporizador. Así que debes hacer que tu controlador de temporizador sea muy magro y no hagas nada más que preparar y comenzar un nuevo hilo de trabajo.

...
ThreadPool.QueueUserWorkItem(new WaitCallback(MyWorkerDelegate),
  myCustomObjectThatContainsAResetEvent);

Otros consejos

Para la solución fuera de la caja, no hay manera. La razón principal es que el subproceso que ejecuta la función TimerCallback está probablemente aún vivo, incluso si el código que ejecuta la devolución de llamada se ha completado. El TimerCallback es ejecutado por un Thread fuera del ThreadPool. Cuando se completa la tarea, el subproceso no muere, sino que vuelve a la cola para la siguiente tarea del grupo de subprocesos.

Para que esto funcione, tendrá que utilizar una forma de señalización segura para detectar que la operación se ha completado.

Documentación del temporizador

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top