GC.WaitForPendingFinalizers GC.WaitForPendingFinalizers GC.WaitForPendingFinalizers GC.WaitForPendingFinalizers Method

定義

ファイナライザーのキューを処理するスレッドがそのキューを空にするまで、現在のスレッドを中断します。Suspends the current thread until the thread that is processing the queue of finalizers has emptied that queue.

public:
 static void WaitForPendingFinalizers();
public static void WaitForPendingFinalizers ();
static member WaitForPendingFinalizers : unit -> unit
Public Shared Sub WaitForPendingFinalizers ()

次の例は、 WaitForPendingFinalizersメソッドを使用して、収集されたすべてのオブジェクトの終了処理が完了するまで、現在のスレッドを中断する方法を示しています。The following example demonstrates how to use the WaitForPendingFinalizers method to suspend the current thread until finalization of all the collected objects is complete.

using namespace System;
ref class MyFinalizeObject
{
private:

   // Make this number very large to cause the finalizer to
   // do more work.
   literal 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 );

      }
   }

};


// 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;
int main()
{
   MyFinalizeObject^ mfo = nullptr;
   
   // Create and release a large number of objects
   // that require finalization.
   for ( int j = 0; j < numMfos; j++ )
   {
      mfo = gcnew MyFinalizeObject;

   }
   
   //Release the last object created in the loop.
   mfo = nullptr;
   
   //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" );

   }
}

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);
	   }
        }
    }
}
Imports System

Namespace WaitForPendingFinalizersExample
   Class MyWaitForPendingFinalizersClass
  
    ' You can increase this number to fill up more memory.
      Private Const numMfos As Integer = 1000
      ' You can increase this number to cause more
      ' post-finalization work to be done.
      Private Const maxIterations As Integer = 100
     
      Overloads Shared Sub Main()
         Dim mfo As MyFinalizeObject = Nothing
      
         ' Create and release a large number of objects
         ' that require finalization.
         Dim j As Integer
         For j = 0 To numMfos - 1
            mfo = New MyFinalizeObject()
         Next j
      
         'Release the last object created in the loop.
         mfo = Nothing
      
         '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.
         Dim i As Integer
         For i = 0 To maxIterations - 1
            Console.WriteLine("Doing some post-finalize work")
         Next i
      End Sub
   End Class


   Class MyFinalizeObject
      ' Make this number very large to cause the finalizer to
      ' do more work.
      Private maxIterations As Integer = 10000
      
      Protected Overrides Sub Finalize()
         Console.WriteLine("Finalizing a MyFinalizeObject")
      
         ' Do some work.
         Dim i As Integer
         For i = 0 To maxIterations - 1
            ' This method performs no operation on i, but prevents 
            ' the JIT compiler from optimizing away the code inside 
            ' the loop.
            GC.KeepAlive(i)
         Next i
         MyBase.Finalize()
      End Sub
   End Class
End Namespace

注釈

ガベージコレクターは、解放できるオブジェクトを検出すると、各オブジェクトをチェックして、オブジェクトの終了の要件を決定します。When the garbage collector finds objects that can be reclaimed, it checks each object to determine the object's finalization requirements. オブジェクトがファイナライザーを実装し、を呼び出しSuppressFinalizeて終了処理を無効にしていない場合、オブジェクトは、終了準備完了としてマークされているオブジェクトのリストに配置されます。If an object implements a finalizer and has not disabled finalization by calling SuppressFinalize, the object is placed in a list of objects that are marked as ready for finalization. ガベージコレクターは、このFinalizeリスト内のオブジェクトのメソッドを呼び出し、リストからエントリを削除します。The garbage collector calls the Finalize methods for the objects in this list and removes the entries from the list. このメソッドは、すべてのファイナライザーの実行が完了するまでブロックします。This method blocks until all finalizers have run to completion.

ファイナライザーが実行されるスレッドは指定されていないため、このメソッドが終了する保証はありません。The thread on which finalizers are run is unspecified, so there is no guarantee that this method will terminate. ただし、このスレッドは、メソッドのWaitForPendingFinalizers実行中に別のスレッドによって中断される可能性があります。However, this thread can be interrupted by another thread while the WaitForPendingFinalizers method is in progress. たとえば、ある期間待機する別のスレッドを開始し、このスレッドが中断されている場合は、このスレッドを中断することができます。For example, you can start another thread that waits for a period of time and then interrupts this thread if this thread is still suspended.

適用対象