CriticalHandle.ReleaseHandle Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
При переопределении в производном классе выполняет код, необходимый для освобождения дескриптора.
protected:
abstract bool ReleaseHandle();
protected abstract bool ReleaseHandle();
abstract member ReleaseHandle : unit -> bool
Protected MustOverride Function ReleaseHandle () As Boolean
Возвращаемое значение
Комментарии
Метод ReleaseHandle гарантированно вызывается только один раз, если вы используете надлежащие механизмы синхронизации, чтобы обеспечить выполнение только одного вызова Close метода или Dispose метода. Метод ReleaseHandle не будет вызываться, если IsInvalid это trueсвойство или IsClosed свойство. Реализуйте этот метод в CriticalHandle производных классах для выполнения любого кода, необходимого для освобождения дескриптора. Поскольку одна из функций CriticalHandle заключается в обеспечении предотвращения утечки ресурсов, код в реализации ReleaseHandle не должен завершать ошибку. Сборщик мусора вызывается ReleaseHandle после выполнения обычных методов завершения для объектов, собранных в то же время, и гарантирует, что ресурсы вызывают его и что он не будет прерван во время выполнения. Этот метод будет подготовлен как ограниченный регион выполнения (CER) во время построения экземпляра (вместе со всеми методами в его статической детерминируемой графе вызовов). Несмотря на то, что это предотвращает прерывания потоков, необходимо быть осторожным, чтобы не вводить пути сбоя в методе переопределения ReleaseHandle . В частности, примените ReliabilityContractAttribute атрибут к любым методам, из которые ReleaseHandleвы вызываете. В большинстве случаев этот код должен быть следующим:
ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)
Кроме того, для простой очистки (например, вызова API CloseHandle Windows в дескрипторе файла) можно проверить возвращаемое значение для вызова одной платформы. Для сложной очистки может потребоваться много логики программы и многие вызовы методов, некоторые из которых могут завершиться ошибкой. Необходимо убедиться, что в логике программы есть резервный код для каждого из этих случаев.
ReleaseHandle Если метод возвращается false по какой-либо причине, он создает помощник по отладке managedHandleFailed.