Поделиться через


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 после выполнения обычных методов завершения для объектов, которые были собраны в то же время. Сборщик мусора гарантирует, что ресурсы для вызова этого метода не будут прерваны во время его выполнения.

Кроме того, для простой очистки (например, вызова API CloseHandle Windows в дескрипторе файла) можно проверить возвращаемое значение для вызова вызова с одной платформой. Для сложной очистки может потребоваться много логики программы и множество вызовов методов, некоторые из которых могут завершиться ошибкой. Необходимо убедиться, что логика программы содержит резервный код для каждого из этих случаев.

Если ReleaseHandle по какой-либо причине возвращается false , при запуске на платформе .NET Framework создается помощник по управляемой отладке releaseHandleFailed . Это помогает обнаруживать случаи, когда попытка освободить ресурсы завершается неудачей.

Применяется к

См. также раздел