CriticalHandle.ReleaseHandle メソッド


派生クラスでオーバーライドされると、ハンドルを解放するために必要なコードを実行します。When overridden in a derived class, executes the code required to free the handle.

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


ハンドルが正常に解放された場合は true。深刻なエラーが発生した場合は falsetrue if the handle is released successfully; otherwise, in the event of a catastrophic failure, false. この場合、releaseHandleFailed マネージド デバッグ アシスタントが生成されます。In this case, it generates a releaseHandleFailed Managed Debugging Assistant.


ReleaseHandleメソッドCloseまたはメソッドへの呼び出しが1つだけになるように適切な同期機構を使用する場合は、メソッドが1回だけ呼び出されることがDispose保証されます。The ReleaseHandle method is guaranteed to be called only once, provided that you employ proper synchronization mechanisms to ensure that only one call to the Close or Dispose method is made. またはReleaseHandle プロパティがtrueの場合、メソッドは呼び出されません。 IsClosed IsInvalidThe ReleaseHandle method will not be called if the IsInvalid or IsClosed property is true. このメソッドをCriticalHandle派生クラスに実装して、ハンドルを解放するために必要なすべてのコードを実行します。Implement this method in your CriticalHandle derived classes to execute any code that is required to free the handle. CriticalHandle関数の1つはリソースリークの防止を保証することであるため、のReleaseHandle実装のコードは失敗しないようにする必要があります。Because one of the functions of CriticalHandle is to guarantee prevention of resource leaks, the code in your implementation of ReleaseHandle must never fail. ガベージコレクターは、 ReleaseHandle同時にガベージコレクションされたオブジェクトに対して通常のファイナライザーが実行された後にを呼び出し、リソースの呼び出しを保証し、処理中に中断されないようにします。The garbage collector calls ReleaseHandle after normal finalizers have been run for objects that were garbage collected at the same time, and guarantees the resources to invoke it and that it will not be interrupted while it is in progress. このメソッドは、インスタンスの構築時に制約された実行領域 (CER) として準備されます (静的な determinable 呼び出しグラフ内のすべてのメソッドと共に)。This method will be prepared as a constrained execution region (CER) at instance construction time (along with all the methods in its statically determinable call graph). これにより、スレッドの中止が中断されることはありませんが、オーバーライドReleaseHandleされたメソッドにエラーパスを導入しないように注意する必要があります。Although this prevents thread abort interrupts, you must still be careful not to introduce any fault paths in your overridden ReleaseHandle method. 特に、からReliabilityContractAttribute ReleaseHandle呼び出すメソッドに属性を適用します。In particular, apply the ReliabilityContractAttribute attribute to any methods you call from ReleaseHandle. ほとんどの場合、このコードは次のようになります。In most cases this code should be:

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

また、単純なクリーンアップ (ファイルハンドルで Windows API CloseHandleを呼び出すなど) の場合は、単一のプラットフォーム呼び出しの戻り値を確認できます。Additionally, for simple cleanup (for example, calling the Windows API CloseHandle on a file handle) you can check the return value for the single platform invoke call. 複雑なクリーンアップでは、多くのプログラムロジックと多くのメソッド呼び出しがあり、その一部が失敗する可能性があります。For complex cleanup, you may have a lot of program logic and many method calls, some of which might fail. プログラムロジックにそれぞれのケースのフォールバックコードがあることを確認する必要があります。You must ensure that your program logic has fallback code for each of those cases.

何らかReleaseHandleの理由falseでメソッドがを返した場合、 releasehandlefailedマネージデバッグアシスタントが生成されます。If the ReleaseHandle method returns false for any reason, it generates a releaseHandleFailed Managed Debugging Assistant.