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

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

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

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

適用対象

こちらもご覧ください