Temporizador confiable en una aplicación de consola

103

Soy consciente de que en .NET hay tres tipos de temporizador (consulte Comparación de las clases de temporizador en la biblioteca de clases de .NET Framework ). Elegí un temporizador enhebrado ya que los otros tipos pueden derivar si el hilo principal está ocupado, y necesito que sea confiable.

La forma en que este temporizador funciona bajo el control del temporizador se coloca en otro hilo para que siempre pueda marcar junto con el inicio del trabajo completado en el hilo principal cuando no está ocupado.

El problema con este temporizador en una aplicación de consola es que mientras el temporizador avanza en otro hilo, el hilo principal no hace nada para que la aplicación se cierre.

Intenté agregar un while truebucle, pero luego el hilo principal está demasiado ocupado cuando el temporizador se apaga.

Juan
fuente

Respuestas:

59

Puede usar algo como Console.ReadLine()para bloquear el hilo principal, por lo que otros hilos en segundo plano (como hilos del temporizador) seguirán funcionando. También puede usar un AutoResetEvent para bloquear la ejecución, luego (cuando lo necesite) puede llamar al método Set () en ese objeto AutoResetEvent para liberar el hilo principal. También asegúrese de que su referencia al objeto Timer no se salga del alcance y la recolección de basura.

huseyint
fuente
20

Considere usar un ManualResetEvent para bloquear el subproceso principal al final de su procesamiento e invocarlo una Reset()vez que el procesamiento del temporizador haya finalizado. Si esto es algo que debe ejecutarse continuamente, considere moverlo a un proceso de servicio en lugar de una aplicación de consola.

Greg Hurlman
fuente