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 после запуска обычных методов завершения для объектов, собранных в то же время. Сборщик мусора гарантирует ресурсы для вызова этого метода и что метод не будет прерван во время выполнения. Этот метод будет подготовлен в виде ограниченной области выполнения (CER) во время создания экземпляра (вместе со всеми методами в графе статически определяемых вызовов). Несмотря на то, что это предотвращает прерывания потоков, необходимо соблюдать осторожность, чтобы не вводить пути сбоя в переопределенном ReleaseHandle методе. В частности, примените ReliabilityContractAttribute атрибут ко всем методам, из которые ReleaseHandleвы вызываете. В большинстве случаев этот код должен быть следующим:
ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)
Кроме того, для простой очистки (например, вызова API CloseHandle
Windows в дескрипторе файла) можно проверить возвращаемое значение для вызова вызова одной платформы. Для сложной очистки может быть много логики программы и многие вызовы методов, некоторые из которых могут завершиться ошибкой. Необходимо убедиться, что в логике программы есть резервный код для каждого из этих случаев.
Если ReleaseHandle возвращается false
по какой-либо причине, он создает помощник по отладке управляемого кода releaseHandleFailed . Это помогает обнаруживать случаи, когда попытка освободить ресурсы завершается сбоем.