CriticalHandle.ReleaseHandle メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
派生クラスでオーバーライドされると、ハンドルを解放するために必要なコードを実行します。
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 マネージド デバッグ アシスタントが生成されます。
適用対象
こちらもご覧ください
.NET