SafeHandle.ReleaseHandle 方法

定义

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

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

适用于

另请参阅