2009-07-23 6 views
0

wie die von dem Timer in der C# verwendete Ressource freigegeben wurde, versuchte die folgenden Methoden, aber nichts funktioniert in meiner Anwendung..NET Timer - Ressourcenbereinigung

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

Bitte präzisieren. Wie funktioniert es nicht? –

Antwort

2

Woher wissen Sie, dass es nicht funktioniert hat?
Dispose() sollte funktionieren. Kannst du den Timer danach noch benutzen (solltest du nicht, wenn es gut geht)?
Wenn Sie den Speicher freigeben möchten, müssen Sie GC.Collect() aufrufen.

Auch ist es empfehlenswert, den Timer in einer using-Anweisung zu umwickeln (wenn Sie den Timer an anderer Stelle nicht brauchen):

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

Timer.Dispose() wird dann automatisch aufgerufen werden.


Hier ist ein Beispiel für die Entsorgung eines Timers:

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."); 
    } 

Nennen Sie es in Ihrer Methode Main(). Es wird "Hallo" gedruckt. für 5 Sekunden, dann ist der Timer angeordnet und t_Elapsed wird nicht erneut aufgerufen. Nach weiteren 5 Sekunden wird die App beendet.

+1

Beachten Sie, dass das Aufrufen von GC.Collect() nicht empfohlen wird, da es sich in die Laufzeitumgebung einmischt. –

+0

Rechts. Ich würde auch erwarten, dass die Menge an Speicher von Timers unbedeutend ist, so GC.Collect() wird Ihnen nicht viel Speicher geben. – weiqure

0

In C# werden Ressourcen nicht sofort freigegeben, da es sich um eine verwaltete Umgebung handelt. Wenn Sie Dispose() aufrufen, markiert es die Ressource für Garbage Collection. Garbage Collection wird jedoch nicht automatisch mit dem Aufruf von Dispose gestartet, sondern wird von der Runtime Environment erst dann gestartet, wenn es den Anforderungen entspricht.

Rufen Sie einfach Dispose an und die Ressourcen werden berücksichtigt, wenn die Laufzeitumgebung entscheidet, dass einige Ressourcen freigegeben werden müssen.

See this link for a further description of Garbage Collection.

0

Ich vermute, dass dies ein System.Timers.Timer ist, angesichts der Liste, die Sie oben haben.

sollten Sie in der Lage sein zu tun:

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

Sobald Sie dies getan haben, hat sich der Timer gestoppt, und seine Haupt (unmanaged) Ressourcen befreit haben werden. Die Ressourcen, die sie verwendet haben, werden jedoch nicht bereinigt, bis alle Elemente, auf die sie verweisen, nicht mehr in der Anwendung verankert sind, und der GC kann sie bereinigen.

Stellen Sie sicher, dass Ihre t-Variable den Gültigkeitsbereich verlassen darf und dass alles, was von Ihrem t-Timer verwendet wird, den Gültigkeitsbereich verlassen darf. Der GC bereinigt diese Objekte zu einem Zeitpunkt, an dem sie fertig ist, wenn Sie das tun.