2008-08-01 14 views
75

Soy consciente de que en .NET hay tres tipos de temporizadores (vea Comparing the Timer Classes in the .NET Framework Class Library). He elegido un temporizador con rosca ya que los otros tipos pueden derivar si el hilo principal está ocupado, y necesito que esto sea confiable.Temporizador confiable en una aplicación de consola

La forma en que funciona este temporizador en el control del temporizador se pone en otro hilo para que siempre pueda coincidir con el trabajo iniciado 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 subproceso, el subproceso principal no está haciendo nada para que la aplicación se cierre.

Intenté agregar un while true bucle, pero entonces el hilo principal está demasiado ocupado cuando el temporizador se apaga.

Respuesta

48

Puede usar algo como Console.ReadLine() para bloquear el hilo principal, por lo que otros hilos de fondo (como los 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 quede fuera del alcance y de la basura recolectada.

15

Considere usar un ManualResetEvent para bloquear el hilo principal al final de su procesamiento, y llame al Reset() una vez que el proceso del temporizador haya finalizado. Si esto es algo que necesita ejecutarse constantemente, considere mover esto a un proceso de servicio en lugar de una aplicación de consola.

Cuestiones relacionadas