2010-10-08 5 views
2

je le code suivant qui utilise le System.Timers.Timer:Comment disposer minuterie

// an instance variable Timer inside a method 
Timer aTimer = new Timer(); 
aTimer.Elapsed += new ElapsedEventHandler(OnElapsedTime); 
aTimer.Interval = 300000; 
aTimer.AutoReset = false; 
aTimer.Enabled = true; 
while (aTimer.Enabled) 
{ 
    if (count == expectedCount) 
    { 
     aTimer.Enabled = false; 
     break; 
    } 
} 

Et je le code suivant pour gérer l'événement:

private static void OnElapsedTime(Object source, ElapsedEventArgs e) 
{ 
    // do something 
} 

La question est la suivante: Si l'événement timer est déclenché et entre dans OnElapsedTime, l'objet Timer s'arrête-t-il et est-il correctement collecté? Si ce n'est pas le cas, que puis-je faire pour éliminer correctement l'objet Minuterie/l'arrêter? Je ne veux pas que la minuterie se glisse soudainement et provoque des ravages dans mon application.

+3

'while (aTimer.Enabled)' ... Cela ne va-t-il pas à l'encontre de l'utilisation d'une minuterie? – dtb

+0

Eh bien, je voulais juste faire une boucle pendant que la minuterie est toujours active. La minuterie est vraiment juste un moyen pour le système d'attendre un certain temps. Les threads ne sont pas favorisés dans mon contexte, j'ai donc choisi d'utiliser la minuterie à la place. – BeraCim

+0

Vous utilisez un fil si vous le souhaitez ou non. Thread.Sleep semble être le chemin à parcourir. Le code que vous avez là est en réalité assez méchant en termes de performances. –

Répondre

8

Appel Timer.Dispose: http://msdn.microsoft.com/en-us/library/zb0225y6.aspx

private static void OnElapsedTime(Object source, ElapsedEventArgs e) 
{ 
    ((Timer)source).Dispose(); 
} 
+2

La mise au rebut est une très bonne pratique, cependant la minuterie devrait être correctement garbaged quand il n'y a pas plus de course. Quoi qu'il en soit, avant d'invoquer la méthode Dispose, je désabonne le gestionnaire d'événements: cela empêchera d'autres rappels inattendus. –

4

Vous ne devez pas utiliser la boucle while, AutoReset = false font déjà que Timer déclencheur une seule fois.