2017-09-25 2 views
2

Donc, je sais à cause de la question Can Timers get automatically garbage collected? que le System.Timers.Timer ne sera pas recueilli en premier lieu. Mais ma vraie question est: est-ce que je dois arrêter ou jeter la minuterie?Dois-je arrêter System.Timers.Timer?

private void CreateTimer() 
{ 
    var timer = new Timer(); 
    timer.Elapsed += TimerElapsed; 
    timer.Interval = 30000; 
    timer.AutoReset = true; 
    timer.Enabled = true; 
} 

Je veux dire que ce temporisateur fonctionnera pour toujours. Mais maintenant je n'ai plus besoin de mon objet qui a créé le Timer dans la Méthode. Dois-je arrêter ou éliminer le Timer pour qu'il soit ramassé?

+0

Il existe une différence entre arrêter et éliminer. L'arrêt d'une minuterie serait ce dont quelqu'un aurait besoin pendant le cycle de vie du minuteur. – apomene

+0

Vous pouvez le vérifier vous-même: Créer quelque chose comme MesseBox.Show on Elapsed, puis le tuer, par exemple, en fermant subWindow. – sTrenat

+1

Je ne pense pas que ce sera ramassé les ordures jusqu'à ce que vous appelez «disposer» dessus. Ce n'est pas grave si vous «arrêtez» la minuterie. Plus ici: 'Toujours appeler Dispose avant de libérer votre dernière référence au composant. Sinon, les ressources utilisées ne seront pas libérées tant que le garbage collector n'aura pas appelé la méthode Finalize de l'objet Component.' https://msdn.microsoft.com/en-us/library/3cc9y48w(v=vs.110).aspx – Achilles

Répondre

2

Je ne pense pas qu'il sera recueilli poubelle jusqu'à ce que vous appelez .Dispose() dessus. Peu importe si vous .Stop() le minuteur.

Il semble donc que l'appel Timer.Stop() ou la mise en Timer.Enabled false devrait être suffisant, parce que appelleraient Timer.Dispose() pour vous. Ref: Timer.Enabled

De MSDN:

Appelez toujours Dispose avant de libérer la dernière référence à la composante. Sinon, les ressources utilisées ne seront pas libérées tant que le garbage collector n'aura pas appelé la méthode Finalize de l'objet Component. More here

Si vous souhaitez qu'il soit disposé automatiquement, puis mettre cette logique dans une méthode distincte utilisant la propriété Timer.Elapsed comme expliqué Here.

+1

Non - "Je ne pense pas que ce sera une collecte de déchets tant que vous n'aurez pas appelé' .Dispose() 'dessus." - Ce n'est pas correct. S'il n'y a aucune référence en direct, il sera GC'ed indépendamment du fait que '.Dispose()' ait été appelé. – Enigmativity

+1

L'arrêt de la minuterie est suffisant, pas d'élimination explicite() requise.Ce n'est jamais nécessaire, pas ce que l'IDisposable était censé faire. Winforms l'abuse mais cela ne s'étend pas aux classes BCL. –

+0

En regardant l'implémentation de la classe Timer, vous avez raison. 'Timer.Stop()' définit en fait 'Enabled' sur false, ce qui appelle' timer.Dispose() ', donc appeler' Timer.Stop() 'devrait suffire. Je vais mettre à jour la réponse. – Achilles