J'ai une application qui utilise système .Timers.Timer code>
objets pour faire des expirations et des notifications par courrier électronique, etc. Actuellement, le système a quelques centaines de minuteries vivantes à la fois, mais nous allons élargir l'utilisation de l'application et que ce nombre pourrait commencer à se mettre à l'échelle dans les milliers (probablement pas supérieur à 10 000). p>
Je ne trouve aucune information sur l'impulsion du nombre de minuteries, donc je suppose que cela ne sera pas un problème. Est-ce que quelqu'un sait si cela va être un problème et je devrais examiner de manière proactive la modification de la façon dont je traite les expirations? P>
4 Réponses :
Que diriez-vous d'utiliser un seul minuteur? La minuterie sera expirée sur la première expiration et effectuera la logique appropriée à l'expiration. Puis réinitialiser son intervalle à l'expiration suivante? Juste peut-être une autre façon de gérer l'expiration en utilisant une seule minuterie. P>
De toute évidence, il y a plusieurs façons de ne pas utiliser beaucoup de minuteries. Cependant, je me demande si cela vaut la peine de changer le code.
Un peu en retard sur cela, je sais, mais. . . p>
Il y a probablement une limite sur le nombre de minuteries que vous pouvez avoir dans une file d'attente de minuterie particulière. Je ne sais pas ce que cette limite est. Quand j'ai enquêté sur ces minuteries par an il y a environ, il semblait que le framework .NET crée une file d'attente d'une minuterie par processus (ou peut-être que c'était par domaine d'application), et toutes les minuteries que vous créez sont placées dans cette file d'attente. P >
Il n'a probablement pas de sens de dupliquer la fonctionnalité de la file d'attente de la minuterie en créant votre propre système utilisant une seule minuterie et un type de mécanisme de file d'attente prioritaire pour contrôler ce qu'on appelle la prochaine. C'est ce que la file d'attente du minuteur fait déjà pour vous. P>
On dirait que vous pouviez facilement créer un programme de test qui crée 10 000 minuteries. Définissez chacun pour cocher une seconde après le dernier et définir sa période à 10 000 secondes. Puis asseyez-vous et regardez cela. Ou avez-vous que votre programme garde une trace de qui devrait cocher ensuite et qui tienne en réalité la suivante. P> system.timers.timer code> est un wrapper autour de
system.threading.threading.timer code>, qui est à son tour un wrapper .NET autour de Windows ' TIMER files d'attente . Les minuteries de la file d'attente de minuterie sont très légères - utilisez peu de ressources système. Je n'ai pas été mis à l'échelle à des milliers de minuteries, mais des centaines de minuteries fonctionnent bien. D'après ce que j'ai pu glaner de la mise en œuvre, je ne peux pas imaginer qu'il y aurait des problèmes avec des milliers de minuteries. P>
Vous devriez être bien en utilisant beaucoup d'entre eux. Mais comme PDIDDY dit, vous devriez vraiment envisager de changer votre code, si vous le pouvez. 1 VS 10.000 Les minuteries font une différence. ; -) p>
N'est-il pas préférable d'utiliser une minuterie seulement? Cette minuterie incendie e. g. Chaque seconde ou chaque minute, puis vous comparez DateTime.Now () aux objets DateTime de consigne de votre plan d'horaire. Si l'objet DateTime de point de consigne correspond à DateTime.Now (), Fumez un événement et recalculez la prochaine DateTime d'exécution de votre objet. P>
Cela me frappe comme implémentant ma propre minuterie. Je ne me souviens pas de ce que je travaillais sur le dos en 2010 qui m'avait utilisé en utilisant de la sorte, mais si les minuteries d'abstraction fournies étaient ce que je voulais, je cherchais évidemment à éviter de mettre en œuvre mon propre "plan d'annexe" :)
J'ai une question similaire sur le threading.Timer.
Si vous êtes intéressé, consultez la ressource de système d'exploitation fondamentale que la classe de minuterie repose sur l'utilisation de réflecteurs sur les DLL système. Puis posez la question à Mark Russinovitch blogs.technet.com/b/markrussinovich
@Gregc, pouvez-vous poster un lien pour cela afin que je puisse vérifier ces réponses?