Auf Englisch lesen

Freigeben über


GC.WaitForPendingFinalizers Methode

Definition

Hält den aktuellen Thread so lange an, bis der Thread, der die Finalizerwarteschlange verarbeitet, diese Warteschlange geleert hat.

public static void WaitForPendingFinalizers();

Beispiele

Im folgenden Beispiel wird veranschaulicht, wie Sie die WaitForPendingFinalizers -Methode verwenden, um den aktuellen Thread anzusetzen, bis die Fertigstellung aller gesammelten Objekte abgeschlossen ist.

using System;

namespace WaitForPendingFinalizersExample
{
   class MyWaitForPendingFinalizersClass
   {
    // You can increase this number to fill up more memory.
    const int numMfos = 1000;
    // You can increase this number to cause more
    // post-finalization work to be done.
    const int maxIterations = 100;

    static void Main(string[] args)
    {
       MyFinalizeObject mfo = null;

       // Create and release a large number of objects
       // that require finalization.
       for(int j = 0; j < numMfos; j++)
       {
          mfo = new MyFinalizeObject();
       }

       //Release the last object created in the loop.
       mfo = null;

       //Force garbage collection.
       GC.Collect();

       // Wait for all finalizers to complete before continuing.
       // Without this call to GC.WaitForPendingFinalizers,
       // the worker loop below might execute at the same time
       // as the finalizers.
       // With this call, the worker loop executes only after
       // all finalizers have been called.
       GC.WaitForPendingFinalizers();

       // Worker loop to perform post-finalization code.
       for(int i = 0; i < maxIterations; i++)
       {
          Console.WriteLine("Doing some post-finalize work");
       }
    }
   }

   class MyFinalizeObject
   {
    // Make this number very large to cause the finalizer to
    // do more work.
    private const int maxIterations = 10000;

    ~MyFinalizeObject()
    {
       Console.WriteLine("Finalizing a MyFinalizeObject");
            
       // Do some work.
       for(int i = 0; i < maxIterations; i++)
       {
          // This method performs no operation on i, but prevents
          // the JIT compiler from optimizing away the code inside
          // the loop.
          GC.KeepAlive(i);
       }
        }
    }
}

Hinweise

Wenn der Garbage Collector Objekte findet, die wieder beansprucht werden können, überprüft er jedes Objekt, um die Finalisierungsanforderungen des Objekts zu bestimmen. Wenn ein Objekt einen Finalizer implementiert und die Finalisierung nicht durch Aufrufen SuppressFinalizedeaktiviert hat, wird das Objekt in einer Liste von Objekten platziert, die als bereit für die Finalisierung markiert sind. Der Garbage Collector ruft die Finalize Methoden für die Objekte in dieser Liste auf und entfernt die Einträge aus der Liste. Diese Methode blockiert, bis alle Finalisierer bis zum Abschluss ausgeführt wurden.

Der Thread, in dem Die Finalizer ausgeführt werden, ist nicht angegeben, sodass es keine Garantie gibt, dass diese Methode beendet wird. Dieser Thread kann jedoch von einem anderen Thread unterbrochen werden, während die WaitForPendingFinalizers Methode ausgeführt wird. Sie können beispielsweise einen anderen Thread starten, der eine längere Zeit wartet und dann diesen Thread unterbricht, wenn dieser Thread weiterhin angehalten wird.

Gilt für:

Produkt Versionen
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0