Je dis cela en réponse à beaucoup de questions: N'oubliez pas que le code source (géré) de l'infrastructure est disponible. Vous pouvez utiliser cet outil pour obtenir tout: http://www.codeplex.com/NetMassDownloader
Malheureusement, dans ce cas précis, beaucoup de la mise en œuvre est en code natif, afin de ne pas regarder ce ...
Ils Cependant, utilisez certainement les threads de pool plutôt qu'un thread par timer. La manière standard d'implémenter une grande collection de temporisateurs (comme le noyau le fait en interne, et je suppose que c'est indirectement la fin de votre grande collection de temporisateurs) est de maintenir la liste triée par le temps-jusqu'à- expiration - le système ne doit donc plus jamais se soucier de vérifier le prochain minuteur qui va expirer, pas toute la liste.
En gros, cela donne O (log n) pour démarrer un temporisateur et O (1) pour traiter les temporisateurs.
Edit: Je viens de chercher dans le livre de Jeff Richter. Il dit (de Threading.Timer) qu'il utilise un seul thread pour tous les objets Timer, ce thread sait quand le prochain timer (c'est-à-dire comme ci-dessus) est dû et appelle ThreadPool.QueueUserWorkItem pour les callbacks comme approprié. Cela a pour effet que si vous ne finissez pas d'effectuer un rappel sur une minuterie avant la prochaine, votre rappel sera renvoyé sur un autre thread de pool. Donc, en résumé, je doute que vous voyiez un gros problème avec beaucoup de minuteries, mais vous pourriez souffrir de l'épuisement du pool de threads si un grand nombre d'entre eux tiraient au même minuteur et/ou leurs rappels sont lents.
Une file d'attente prioritaire serait probablement plus efficace qu'une liste triée, à moins que tous les temporisateurs ne soient ajoutés en bloc au début, puis triés, et qu'ils ne soient pas ajoutés plus tard. – RAL
Bien sûr - 'une liste triée par date-jusqu'à-expiration' pourrait certainement être une sorte de file d'attente prioritaire - je ne voulais pas dire 'une liste qui a eu une opération de tri en cours' –
Je viens de passer du temps sur le code dans le sscli. Notez que le .NET ThreadPool a énormément changé depuis la sortie de Rotor, il est donc tout à fait possible que System.Threading.Timer ait également changé énormément. Quoi qu'il en soit, dans le Rotor, les minuteurs sont conservés dans une liste chaînée et déclenchés par un thread de déclenchement de minuterie dédié. Il y a un thread de déclenchement de temporisation pour toute la durée d'exécution (même dans plusieurs domaines d'application). –