2016-06-10 6 views
1

Wird der Garbage Collector heruntergefahren, nachdem die gesamte Main-Methode ausgeführt wurde oder noch im Hintergrund ausgeführt wird, um alle Objekte zu bereinigen, die die Main-Methode im Speicher übrig hat.Wann beendet der Garbage Collector in C# exit

+1

Die Finalizer müssen noch ausgeführt werden, nachdem Main beendet wurde. Daher wird der GC/Framework beendet, sobald der Benutzercode vollständig ausgeführt wurde. Es wäre interessant, eine technische, korrekte Antwort darauf zu haben. – MicroVirus

+0

Die Anwendung wird normalerweise beendet, wenn die Main-Methode (und damit der Einstiegspunkt des Programms) beendet wird. An diesem Punkt kann der GC ein wenig laufen, aber schließlich wird das Betriebssystem den gesamten belegten Speicher löschen. – poke

+0

Garbage Collector läuft in einem * separaten Thread *, also kann es auch dann weitergehen, wenn 'Main' zurückgegeben wird –

Antwort

4

Der Garbage Collector wird im Hintergrund am Programm-Exit ausgeführt, um ausstehende Finalizer auszuführen, aber wenn die Finalizer zu lange dauern, gibt sie auf und wird vorzeitig beendet.

Sie können dies demonstrieren mit folgendem Programm:

using System; 
using System.Diagnostics; 
using System.Threading; 

namespace Demo 
{ 
    class Test 
    { 
     ~Test() 
     { 
      Thread.Sleep(250); 
      Trace.WriteLine("In Test finalizer"); 
     } 
    } 

    class Program 
    { 
     static void Main() 
     { 
      var t = new Test[20]; 

      for (int i = 0; i < 20; ++i) 
       t[i] = new Test(); 

      //t = null; 
      //GC.Collect(); 
      //GC.WaitForPendingFinalizers(); 
     } 
    } 
} 

ausführen, das Programm unter dem Debugger und Sie werden sehen, dass nur einige der 20 Finalizers sind tatsächlich laufen, bevor der GC aufgibt.

Sie können jedoch sicherstellen, dass alle anstehenden Finalizers vollständig am Ende des Programms laufen durch

GC.Collect(); 
GC.WaitForPendingFinalizers() 

Aufruf Wenn Sie die drei kommentierten-out Zeilen am Ende der Main() in der obigen Beispielcode Kommentar- und führen Sie das Programm unter dem Debugger erneut aus, Sie werden sehen, dass alle 20 Aufrufe an den Test Finalizer vorgenommen werden.

0

Sobald ein Prozess beendet wird, werden alle Ressourcen freigegeben, die zu ihm gehörten. Dies wird vom Betriebssystem durchgeführt. GC ist für verwaltete Ressourcen.

Ich vermute, Main ist die Einstiegsmethode in diesem Fall zum Beispiel in einer Konsolen-App.

+0

Für C# ausführbare Dateien ist main fast immer der Einstiegspunkt, selbst wenn Sie Formulare haben. – MicroVirus

0

Der Garbage Collector (GC) wird mit Ihrer App gestartet und beendet sich damit. Während der Laufzeit Ihrer App wird sie im Hintergrund ausgeführt, um verwaltete Ressourcen freizugeben.

Der GC wird durch das .NET-Framework selbst erzeugt.

+0

Was ist mit Garbage Collector in Bezug auf Main-Methode – deshmanth

Verwandte Themen