GC.WaitForPendingFinalizers メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
ファイナライザーのキューを処理するスレッドがそのキューを空にするまで、現在のスレッドを中断します。
public:
static void WaitForPendingFinalizers();
public static void WaitForPendingFinalizers ();
static member WaitForPendingFinalizers : unit -> unit
Public Shared Sub WaitForPendingFinalizers ()
例
次の例では、メソッドを WaitForPendingFinalizers 使用して、収集されたすべてのオブジェクトの最終処理が完了するまで現在のスレッドを中断する方法を示します。
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);
}
}
}
}
open System
// You can increase this number to fill up more memory.
let numMfos = 1000
// You can increase this number to cause more
// post-finalization work to be done.
let maxIterations = 100
[<AllowNullLiteral>]
type MyFinalizeObject() =
// Make this number very large to cause the finalizer todo more work.
let maxIterations = 10000
override _.Finalize() =
printfn "Finalizing a MyFinalizeObject"
// Do some work.
for i = 1 to maxIterations do
// This method performs no operation on i, but prevents
// the JIT compiler from optimizing away the code inside
// the loop.
GC.KeepAlive i
let mutable mfo = null
// Create and release a large number of objects
// that require finalization.
for j = 1 to numMfos do
mfo <- 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 _ = 1 to maxIterations do
printfn "Doing some post-finalize work"
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
注釈
ガベージ コレクターは、再利用できるオブジェクトを見つけると、各オブジェクトをチェックして、オブジェクトの最終処理要件を決定します。 オブジェクトがファイナライザーを実装し、呼び出 SuppressFinalizeして終了処理を無効にしていない場合、オブジェクトは最終処理の準備完了としてマークされているオブジェクトの一覧に配置されます。 ガベージ コレクターは、 Finalize このリスト内のオブジェクトのメソッドを呼び出し、リストからエントリを削除します。 このメソッドは、すべてのファイナライザーが完了するまでブロックします。
ファイナライザーが実行されるスレッドは指定されていないため、このメソッドが終了する保証はありません。 ただし、このスレッドは、メソッドの進行中に別の WaitForPendingFinalizers スレッドによって中断される可能性があります。 たとえば、一定期間待機する別のスレッドを開始し、このスレッドがまだ中断されている場合は、このスレッドを中断できます。