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 。 垃圾回收器保证资源调用此方法,并且该方法在正在进行时不会中断。 此方法将在实例构造 (时将作为约束的执行区域 (CER) ,以及其静态可确定的调用图) 中的所有方法一起准备。 尽管这可以防止线程中止中断,但仍必须小心不要在重写 ReleaseHandle 的方法中引入任何故障路径。 具体而言,将 ReliabilityContractAttribute 属性应用于从 ReleaseHandle中调用的任何方法。 在大多数情况下,此代码应为:
ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)
此外,对于简单的清理 (,例如,在文件句柄上调用Windows APICloseHandle
,) 可以检查单个平台调用的返回值。 对于复杂的清理,你可能有很多程序逻辑和许多方法调用,其中一些可能失败。 必须确保程序逻辑针对其中每个情况都有回退代码。
如果 ReleaseHandle 出于任何原因返回 false
,它将生成 releaseHandleFailed 托管调试助手。 这有助于检测尝试释放资源失败的情况。