次の方法で共有


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 が生成されます。 これにより、リソースの解放試行が失敗するケースを検出できます。

適用対象

こちらもご覧ください