SafeHandle.ReleaseHandle メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
派生クラスでオーバーライドされると、ハンドルを解放するために必要なコードを実行します。
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 します。 ガベージ コレクターは、このメソッドを呼び出すリソースと、実行中にメソッドが中断されないことを保証します。 このメソッドは、インスタンスの構築時に (静的に決定可能な呼び出しグラフ内のすべてのメソッドと共に) 制約付き実行領域 (CER) として準備されます。 これによりスレッドの中断割り込みが防止されますが、オーバーライドされた ReleaseHandle メソッドに障害パスを導入しないように注意する必要があります。 特に、呼び出ReleaseHandleすReliabilityContractAttributeメソッドに属性を適用します。 ほとんどの場合、このコードは次のようになります。
ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)
さらに、簡単なクリーンアップ (たとえば、ファイル ハンドルで Windows API CloseHandle
を呼び出す) には、単一のプラットフォーム呼び出し呼び出しの戻り値を確認できます。 複雑なクリーンアップの場合、多くのプログラム ロジックと多くのメソッド呼び出しがあり、その一部が失敗する可能性があります。 プログラム ロジックに、これらの各ケースのフォールバック コードがあることを確認する必要があります。
何らかの理由で返false
された場合ReleaseHandleは、releaseHandleFailed Managed Debugging Assistant が生成されます。 これは、リソースを解放しようとして失敗したケースを検出するのに役立ちます。