SafeHandle.ReleaseHandle メソッド

定義

派生クラスでオーバーライドされると、ハンドルを解放するために必要なコードを実行します。

protected:
 abstract bool ReleaseHandle();
protected abstract bool ReleaseHandle ();
abstract member ReleaseHandle : unit -> bool
Protected MustOverride Function ReleaseHandle () As Boolean

戻り値

ハンドルが正常に解放された場合は true。深刻なエラーが発生した場合は false。 この場合、releaseHandleFailed マネージド デバッグ アシスタントが生成されます。

次のコード例では、 ハンドルを解放し、 クラスに対して提供されるより大きな例の SafeHandle 一部です。

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
override protected bool ReleaseHandle()
{
    // Here, we must obey all rules for constrained execution regions.
    return NativeMethods.CloseHandle(handle);
    // If ReleaseHandle failed, it can be reported via the
    // "releaseHandleFailed" managed debugging assistant (MDA).  This
    // MDA is disabled by default, but can be enabled in a debugger
    // or during testing to diagnose handle corruption problems.
    // We do not throw an exception because most code could not recover
    // from the problem.
}

注釈

メソッドは ReleaseHandle 、プロパティで IsInvalid 定義されているハンドルが有効な場合にのみ、1 回だけ呼び出されます。 ハンドルを解放するために必要なコードを SafeHandle 実行するには、派生クラスでこのメソッドを実装します。 の関数 SafeHandle の 1 つはリソース リークの防止を保証するため、 の実装内の ReleaseHandle コードは失敗してはいけません。 ガベージ コレクターは、同時にガベージ コレクションされたオブジェクトに対して通常のファイナライザーが実行された後に を呼び出 ReleaseHandle します。 ガベージ コレクターは、リソースがこのメソッドを呼び出し、進行中にメソッドが中断されないことを保証します。

さらに、簡単なクリーンアップ (ファイル ハンドルでの Windows API CloseHandle の呼び出しなど) の場合は、単一プラットフォーム呼び出しの戻り値をチェックできます。 複雑なクリーンアップの場合、多くのプログラム ロジックと多くのメソッド呼び出しがあり、その一部が失敗する可能性があります。 プログラム ロジックに、これらの各ケースのフォールバック コードがあることを確認する必要があります。

が何らかの理由で をfalse返す場合ReleaseHandle、.NET Frameworkで実行すると releaseHandleFailed Managed Debugging Assistant が生成されます。 これは、リソースを解放しようとして失敗したケースを検出するのに役立ちます。

適用対象

こちらもご覧ください