lo digo en respuesta a una gran cantidad de preguntas: no olvide que el código fuente (administrado) para el marco está disponible. Puede utilizar esta herramienta para conseguirlo todo: http://www.codeplex.com/NetMassDownloader
Por desgracia, en este caso específico, una gran cantidad de la aplicación es en código nativo, por lo que no se llega a mirarlo ...
Ellos Sin embargo, definitivamente use hilos de grupo en lugar de un hilo por temporizador.
La forma estándar de implementar una gran colección de temporizadores (que es cómo lo hace internamente el kernel, y sospecho que es indirectamente cómo termina su gran colección de temporizadores) es mantener la lista ordenada por tiempo -hasta- vencimiento - por lo que el sistema solo tiene que preocuparse por comprobar el próximo temporizador que expirará, no toda la lista.
Aproximadamente, esto da O (log n) para iniciar un temporizador y O (1) para procesar temporizadores en ejecución.
Edit: Acabo de buscar en el libro de Jeff Richter. Él dice (de Threading.Timer) que usa una única secuencia para todos los objetos del temporizador, este subproceso sabe cuándo debe vencerse el siguiente temporizador (es decir, como el anterior) y llama a ThreadPool.QueueUserWorkItem para las devoluciones de llamada según corresponda. Esto tiene el efecto de que si no finaliza el mantenimiento de una devolución de llamada en un temporizador antes de que venza la siguiente, su devolución de llamada volverá a ingresar en otra secuencia de grupo. Así que, en resumen, dudo que veas un gran problema con tener muchos temporizadores, pero podrías sufrir agotamiento de la agrupación de subprocesos si gran cantidad de ellos se activan con el mismo temporizador y/o sus devoluciones se ejecutan lentamente.
Una cola de prioridad probablemente sería más eficiente que una lista ordenada a menos que todos los temporizadores se agreguen al por mayor al principio, luego se clasifiquen y no se agreguen más después. – RAL
Claro - 'una lista ordenada por tiempo hasta la expiración' podría ser ciertamente una especie de cola de prioridad - No quise dar a entender 'una lista en la que se ejecutó una operación de clasificación' –
Acabo de pasar algo de tiempo sobre el código en el sscli. Tenga en cuenta que .NET ThreadPool ha cambiado enormemente desde que se lanzó Rotor, por lo que es muy posible que el System.Threading.Timer también haya cambiado enormemente. De hecho, los temporizadores se rompieron en .NET 1.1 y solo se corrigieron para ser seguros y de excepción en .NET 2.0 De todos modos, en Rotor los temporizadores se mantienen en una lista enlazada y disparados por un hilo de disparo del temporizador dedicado. Hay un hilo de activación de temporizador para todo el tiempo de ejecución (incluso en varios dominios de aplicación). –