2009-07-23 4 views
0

comment libérer la ressource utilisée par le temporisateur dans le C# essayé les méthodes suivantes, mais rien ne fonctionne dans mon application..NET Timer - Nettoyage de ressources

  t.Dispose(); 
      t.Stop(); 
      t.EndInit(); 
      t.Close(); 
+1

Veuillez être plus précis. En quoi cela ne fonctionne-t-il pas? –

Répondre

2

Comment savez-vous que cela n'a pas fonctionné?
Dispose() devrait fonctionner. Pouvez-vous encore utiliser la minuterie après (vous ne devriez pas si cela fonctionne bien)?
Si vous souhaitez libérer la mémoire, vous devez appeler GC.Collect().

En outre, il est recommandé d'envelopper la minuterie dans une instruction à l'aide (si vous n'avez pas besoin de la minuterie ailleurs):

using (Timer t = new Timer()) 
{ 
     // Do stuff with t 
} 

Timer.Dispose() sera appelée alors automatiquement.


Voici un exemple de disposer d'une minuterie:

static void TimerTest() 
    { 
     using (Timer t = new Timer(200)) 
     { 
      t.Start(); 
      t.Elapsed += new ElapsedEventHandler(t_Elapsed); 
      System.Threading.Thread.Sleep(5000); // Do some work here. 
     } 
     System.Threading.Thread.Sleep(5000); // Wait before closing the application 
    } 

    static void t_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     Console.WriteLine("Hello."); 
    } 

Appelez-le dans votre méthode Main(). Il imprimera "Bonjour". pendant 5 secondes, le temporisateur est éliminé et t_Elapsed ne sera plus appelé. Après 5 secondes supplémentaires, l'application se ferme.

+1

Notez que l'appel de GC.Collect() n'est pas recommandé car il interagit avec l'environnement d'exécution. –

+0

Droite. Je m'attendrais aussi à ce que la quantité de mémoire prise par Timers soit insignifiante donc GC.Collect() ne vous donnera pas beaucoup de mémoire. – weiqure

0

En C#, les ressources ne sont pas libérées instantanément car il s'agit d'un environnement géré. Lorsque vous appelez Dispose(), il marque la ressource pour Garbage Collection. Cependant, Garbage Collection ne commencera pas automatiquement en appelant Dispose, il sera plutôt démarré par Runtime Environment quand il le jugera bon. Il suffit donc d'appeler Dispose et les ressources sont prises en compte lorsque l'environnement d'exécution décide de libérer des ressources.

See this link for a further description of Garbage Collection.

0

Je devine que c'est un System.Timers.Timer, compte tenu de la liste que vous avez ci-dessus.

Vous devriez être en mesure de le faire:

t.Stop(); 
t.Dispose(); 

Une fois que vous avez fait cela, la minuterie aura cessé, et ses principales ressources (non gérés) aura été libéré. Cependant, les ressources utilisées ne seront pas nettoyées tant que tous les éléments référencés ne seront plus ancrés dans l'application et que le GC pourra les nettoyer.

Assurez-vous que votre variable t est autorisée à sortir de la portée, et que tout élément utilisé par votre t timer est autorisé à sortir de sa portée. Le GC nettoiera ces objets à un moment où il est prêt, si vous le faites.