CriticalHandle.ReleaseHandle メソッド

定義

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

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

戻り値

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

注釈

メソッドはReleaseHandle、 メソッドまたは Dispose メソッドの呼び出しが 1 回だけ行われるように適切な同期メカニズムを使用する場合、Close1 回だけ呼び出されることが保証されます。 ReleaseHandleまたは IsClosed プロパティが の場合、IsInvalidメソッドはtrue呼び出されません。 このメソッドを CriticalHandle 派生クラスに実装して、ハンドルを解放するために必要なコードを実行します。 の機能 CriticalHandle の 1 つはリソース リークの防止を保証するため、 の実装内の ReleaseHandle コードは失敗してはいけません。 ガベージ コレクターは、ガベージ コレクションされたオブジェクトに対して通常のファイナライザーが同時に実行された後に を呼び出 ReleaseHandle し、リソースがそれを呼び出し、実行中に中断されないことを保証します。 このメソッドは、インスタンス構築時 (静的に決定可能な呼び出しグラフ内のすべてのメソッドと共に) 制約付き実行領域 (CER) として準備されます。 これによりスレッド中止の割り込みが防止されますが、オーバーライドされた ReleaseHandle メソッドに障害パスが導入されないように注意する必要があります。 特に、 からReleaseHandle呼び出す任意のメソッドに 属性を適用ReliabilityContractAttributeします。 ほとんどの場合、このコードは次のようになります。

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

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

メソッドが ReleaseHandle 何らかの理由で を false 返した場合は、 releaseHandleFailed マネージド デバッグ アシスタントが生成されます。

適用対象

こちらもご覧ください