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 または Dispose メソッドの呼び出しが1回だけ行われるようにすると、1回だけ呼び出されることが保証されます。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. IsInvalid または IsClosed プロパティが true場合、ReleaseHandle メソッドは呼び出されません。The 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. 特に、ReleaseHandleから呼び出すメソッドに ReliabilityContractAttribute 属性を適用します。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.