GC.WaitForPendingFinalizers メソッド
アセンブリ: mscorlib (mscorlib.dll 内)


ガベージ コレクタは、収集できるオブジェクトを見つけると、それぞれのオブジェクトを検査して、終了操作が必要かどうかを判断します。オブジェクトがファイナライザを実装していて、終了操作を無効にする SuppressFinalize を呼び出していない場合、そのオブジェクトは終了処理の準備ができたものとしてマークされたオブジェクトのリストに入れられます。ガベージ コレクタは、このリストにあるオブジェクトの Finalize メソッドを呼び出し、そのエントリをリストから削除します。このメソッドは、すべてのファイナライザが終了するまでブロックします。
ファイナライザを実行するスレッドは指定されないため、このメソッドが終了する保証はありません。ただし、WaitForPendingFinalizers メソッドが実行中の場合、別のスレッドはこのスレッドを中断することができます。たとえば、ある期間だけ待機する別のスレッドを起動した後、このスレッドがまだ中断されていれば、このスレッドに割り込むことができます。

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
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); } } } }
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" ); } }
package WaitForPendingFinalizersExample ; import System.* ; class MyWaitForPendingFinalizersClass { // You can increase this number to fill up more memory. private static final int numMfos = 1000; // You can increase this number to cause more // post-finalization work to be done. private static final int maxIterations = 100; public 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"); } } //main } //MyWaitForPendingFinalizersClass class MyFinalizeObject { // Make this number very large to cause the finalizer to // do more work. private int maxIterations = 10000; public void finalize() { 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(new Integer(i)); } try { super.finalize(); } catch (System.Exception e) { Console.WriteLine(e.get_Message()); } } //finalize } //MyFinalizeObject

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


Weblioに収録されているすべての辞書からGC.WaitForPendingFinalizers メソッドを検索する場合は、下記のリンクをクリックしてください。

- GC.WaitForPendingFinalizers メソッドのページへのリンク