SafeHandle.ReleaseHandle Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Po zastąpieniu w klasie pochodnej wykonuje kod wymagany do zwolnienia uchwytu.
protected:
abstract bool ReleaseHandle();
protected abstract bool ReleaseHandle ();
abstract member ReleaseHandle : unit -> bool
Protected MustOverride Function ReleaseHandle () As Boolean
Zwraca
true
jeśli uchwyt zostanie wydany pomyślnie; w przeciwnym razie w przypadku katastrofalnego błędu , false
. W takim przypadku generuje on wydanieHandleFailed Managed Debug Assistant.
Przykłady
Poniższy przykład kodu zwalnia uchwyt i jest częścią większego przykładu podanego SafeHandle dla klasy.
[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.
}
Uwagi
Metoda ReleaseHandle ma być wywoływana tylko raz i tylko wtedy, gdy uchwyt jest prawidłowy zgodnie z definicją IsInvalid właściwości . Zaimplementuj tę metodę w klasach pochodnych, SafeHandle aby wykonać dowolny kod wymagany do zwolnienia uchwytu. Ponieważ jedną z funkcji jest SafeHandle zagwarantowanie zapobiegania wyciekom zasobów, kod w implementacji ReleaseHandle programu nigdy nie może zakończyć się niepowodzeniem. Moduł odśmiecujący pamięci wywołuje wywołania ReleaseHandle po normalnym finalizatorze zostały uruchomione dla obiektów, które zostały zebrane w tym samym czasie. Moduł odśmiecywania pamięci gwarantuje, że zasoby będą wywoływać tę metodę i że metoda nie zostanie przerwana, gdy jest w toku.
Ponadto w celu prostego czyszczenia (na przykład wywoływania interfejsu API CloseHandle
systemu Windows na dojściu do pliku) można sprawdzić wartość zwracaną dla wywołania wywołania pojedynczej platformy. W przypadku złożonego czyszczenia może istnieć wiele logiki programu i wiele wywołań metod, z których niektóre mogą zakończyć się niepowodzeniem. Upewnij się, że logika programu ma kod rezerwowy dla każdego z tych przypadków.
Jeśli ReleaseHandle funkcja zwraca false
z jakiegokolwiek powodu, generuje ona asystenta debugowania zarządzanego releaseHandleFailed podczas uruchamiania w .NET Framework. Ułatwia to wykrywanie przypadków, w których próba wydania zasobów kończy się niepowodzeniem.
Dotyczy
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla