SafeHandle.ReleaseHandle 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
在派生类中重写时,执行释放句柄所需的代码。
protected:
abstract bool ReleaseHandle();
protected abstract bool ReleaseHandle ();
abstract member ReleaseHandle : unit -> bool
Protected MustOverride Function ReleaseHandle () As Boolean
返回
如果句柄释放成功,则为 true
;如果出现灾难性故障,则为 false
。 在这种情况下,它会生成 releaseHandleFailed 托管调试助手。
示例
下面的代码示例释放句柄,是为 类提供的更大示例的 SafeHandle 一部分。
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
override protected bool ReleaseHandle()
{
// Here, we must obey all rules for constrained execution regions.
return NativeMethods.CloseHandle(handle);
// If ReleaseHandle failed, it can be reported via the
// "releaseHandleFailed" managed debugging assistant (MDA). This
// MDA is disabled by default, but can be enabled in a debugger
// or during testing to diagnose handle corruption problems.
// We do not throw an exception because most code could not recover
// from the problem.
}
注解
ReleaseHandle仅当句柄按 属性定义IsInvalid有效时,才保证调用方法一次。 在派生类中 SafeHandle 实现此方法,以执行释放句柄所需的任何代码。 由于 的一个功能 SafeHandle 是保证防止资源泄漏,因此实现 中的 ReleaseHandle 代码绝不会失败。 垃圾回收器在为同时进行垃圾回收的对象运行正常终结器后调用 ReleaseHandle 。 垃圾回收器保证资源调用此方法,并且该方法在进行过程中不会中断。
此外,对于简单的清理 (例如,在文件句柄上调用 Windows API CloseHandle
) 可以检查单个平台调用的返回值。 对于复杂的清理,你可能有很多程序逻辑和许多方法调用,其中一些调用可能会失败。 必须确保程序逻辑具有针对其中每个情况的回退代码。
如果 ReleaseHandle 出于任何原因返回 false
,则会在 .NET Framework 上运行时生成 releaseHandleFailed 托管调试助手。 这有助于检测尝试释放资源失败的情况。