2010-06-23 32 views
6

Tengo una aplicación que hace uso de los objetos System.Timers.Timer para hacer expiraciones y notificaciones por correo electrónico y tal. Actualmente, el sistema tiene un par de cientos de temporizadores vivos a la vez, pero vamos a ampliar el uso de la aplicación y ese número podría comenzar a escalar a miles (probablemente no más de 10,000).¿Cuántas instancias System.Timers.Timer puedo crear? ¿Qué tan lejos puedo escalar?

No puedo encontrar ninguna información sobre la ampliación del número de temporizadores, así que supongo que no va a ser un problema. ¿Alguien sabe si esto va a ser un problema y debería considerar de manera proactiva cambiar la forma en que manejo los vencimientos?

+0

Tengo una pregunta similar sobre Threading.Timer. – GregC

+1

@GregC, ¿puedes publicar un enlace para que pueda ver esas respuestas? – tster

Respuesta

11

Un poco tarde en esto, lo sé, pero. . .

System.Timers.Timer es un contenedor alrededor de System.Threading.Timer, que a su vez es un contenedor .NET alrededor de Windows 'Timer Queues. Los temporizadores de cola del temporizador son muy livianos: use pocos recursos del sistema. No he escalado a miles de temporizadores, pero cientos de temporizadores funcionan bien. Por lo poco que he podido obtener de la implementación, no puedo imaginar que haya problemas con miles de temporizadores.

Probablemente haya algún límite en la cantidad de temporizadores que puede tener en cualquier cola de temporizador en particular. No sé cuál es ese límite. Cuando investigué estos temporizadores hace aproximadamente un año, parecía que .NET Framework creaba una cola de temporizador por proceso (o tal vez era por dominio de aplicación), y todos los temporizadores que creas se colocan en esa cola.

Probablemente no tenga sentido duplicar la funcionalidad de la cola del temporizador creando su propio sistema que utiliza un solo temporizador y algún tipo de mecanismo de cola de prioridad para controlar lo que se llama a continuación. Eso es lo que la cola del temporizador ya hace por ti.

Parece que podría crear fácilmente un programa de prueba que crea 10.000 temporizadores. Configure cada uno para que marque un segundo después de la última y establezca su período en 10,000 segundos. Luego siéntate y mira cómo funciona. O haga que su programa realice un seguimiento de quién debe marcar la casilla siguiente y quién marca el próximo.

0

¿Qué le parece usar un solo temporizador? El temporizador caducará en la primera caducidad y hará la lógica apropiada al vencimiento. Luego restablecer su intervalo a la próxima caducidad? Tal vez otra forma de manejar la caducidad usando solo un temporizador.

+2

Obviamente hay varias maneras de no usar muchos temporizadores. Sin embargo, me pregunto si vale la pena cambiar el código. – tster

0

Si le interesa, consulte el recurso de sistema operativo fundamental en el que se basa la clase de temporizador utilizando Reflector en los archivos DLL del sistema.

Luego plantean la pregunta de Mark Russinovich http://blogs.technet.com/b/markrussinovich/

0

Debería estar bien usando muchas de ellas. Pero como dice pdiddy, realmente deberías considerar cambiar tu código, si puedes. 1 vs 10.000 temporizadores hace la diferencia. ;-)

Cuestiones relacionadas