SafeHandle.ReleaseHandle 方法

定义

在派生类中重写时,执行释放句柄所需的代码。

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

返回

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 托管调试助手。 这有助于检测尝试释放资源失败的情况。

适用于

另请参阅