SafeHandle.ReleaseHandle Метод

Определение

При переопределении в производном классе выполняет код, необходимый для освобождения дескриптора.When overridden in a derived class, executes the code required to free the handle.

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

Возвраты

Значение true, если дескриптор освобождается успешно; в противном случае при катастрофическом сбое — значение false.true if the handle is released successfully; otherwise, in the event of a catastrophic failure, false. В таком случае создается управляемый помощник по отладке releaseHandleFailed.In this case, it generates a releaseHandleFailed Managed Debugging Assistant.

Примеры

Следующий пример кода освобождает дескриптор и является частью большого примера, SafeHandle предоставляемого для класса.The following code example releases the handle and is part of a larger example provided for the SafeHandle class.

[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.
}

Комментарии

Метод гарантированно вызывается только один раз и только в том случае, если этот маркер является допустимым IsInvalid , как определено свойством. ReleaseHandleThe ReleaseHandle method is guaranteed to be called only once and only if the handle is valid as defined by the IsInvalid property. Реализуйте этот метод в SafeHandle производных классах для выполнения любого кода, необходимого для освобождения этого обработчика.Implement this method in your SafeHandle derived classes to execute any code that is required to free the handle. Поскольку одна из функций SafeHandle является гарантией предотвращения утечек ресурсов, код в ReleaseHandle реализации не должен быть успешным.Because one of the functions of SafeHandle is to guarantee prevention of resource leaks, the code in your implementation of ReleaseHandle must never fail. Сборщик мусора вызывает ReleaseHandle после выполнения обычных методов завершения для объектов, которые были собраны в то же время.The garbage collector calls ReleaseHandle after normal finalizers have been run for objects that were garbage collected at the same time. Сборщик мусора гарантирует, что ресурсы вызывают этот метод, и что метод не будет прерван во время выполнения.The garbage collector guarantees the resources to invoke this method and that the method will not be interrupted while it is in progress. Этот метод будет подготовлен как область ограниченного выполнения (CER) во время создания экземпляра (вместе со всеми методами в его статическом детерминированном графе вызовов).This method will be prepared as a constrained execution region (CER) at instance construction time (along with all the methods in its statically determinable call graph). Хотя это предотвращает прерывание потока, необходимо следить за тем, чтобы в переопределенном ReleaseHandle методе не были введены пути ошибок.Although this prevents thread abort interrupts, you must still be careful not to introduce any fault paths in your overridden ReleaseHandle method. В частности, примените ReliabilityContractAttribute атрибут к любым методам, которые ReleaseHandleвызываются из.In particular, apply the ReliabilityContractAttribute attribute to any methods you call from ReleaseHandle. В большинстве случаев этот код должен быть следующим:In most cases this code should be:

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

Кроме того, для простой очистки (например, вызова API CloseHandle Windows в виде файла) можно проверить возвращаемое значение для вызова одиночной платформы.Additionally, for simple cleanup (for example, calling the Windows API CloseHandle on a file handle) you can check the return value for the single platform invoke call. Для сложной очистки может существовать множество программных логики и много вызовов методов, некоторые из которых могут завершиться ошибкой.For complex cleanup, you may have a lot of program logic and many method calls, some of which might fail. Необходимо убедиться, что в логике программы есть резервный код для каждого из этих вариантов.You must ensure that your program logic has fallback code for each of those cases.

Если ReleaseHandle метод false возвращает по какой-либо причине, он создает помощник по отладке управляемого кода releaseHandleFailed .If ReleaseHandle returns false for any reason, it generates a releaseHandleFailed Managed Debugging Assistant. Это помогает определить случаи, когда попытка освободить ресурсы завершается ошибкой.This helps you detect cases where your attempt to release resources fails.

Безопасность

SecurityPermission
разрешение на вызов неуправляемого кода.for permission to call unmanaged code. Действие по обеспечению безопасности: LinkDemand.Security action: LinkDemand. Связанное перечисление:UnmanagedCodeAssociated enumeration: UnmanagedCode

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

Дополнительно