Temporizador fiable en una aplicación de consola


Soy consciente de que en .NET hay tres tipos de temporizador (ver Comparando el Temporizador de Clases en el .NET Framework Class Library). He elegido un temporizador de rosca ya que los otros tipos pueden derivar si el hilo principal está ocupado, y necesito que esto sea confiable.

La forma en que este temporizador funciona en el control del temporizador se pone en otro hilo para que siempre pueda marcar junto con el trabajo comenzar completado en el hilo padre cuando no está ocupado.

El problema con este temporizador en una aplicación de consola es que mientras el temporizador está marcando en otro hilo el hilo principal no está haciendo nada por lo que la aplicación se cierra.

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

Author: Peter Mortensen, 2008-08-01

2 answers

Puedes usar algo como Console.ReadLine() para bloquear el hilo principal, para que otros hilos de fondo (como los hilos del temporizador) sigan 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 Temporizador no salga del alcance y la basura recolectada.

 53
Author: huseyint,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-14 12:20:06

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

 19
Author: Greg Hurlman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-14 12:20:15