CriticalHandle.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 przesłonięcia w klasie pochodnej program wykonuje kod wymagany do zwolnienia dojścia.
protected:
abstract bool ReleaseHandle();
protected abstract bool ReleaseHandle ();
abstract member ReleaseHandle : unit -> bool
Protected MustOverride Function ReleaseHandle () As Boolean
Zwraca
true
w przypadku pomyślnego zwolnienia dojścia; w przeciwnym razie w przypadku katastrofalnego błędu, false
. W takim przypadku generuje on asystenta debugowania zarządzanego releaseHandleFailed .
Uwagi
Gwarantuje ReleaseHandle się, że metoda zostanie wywołana tylko raz, pod warunkiem że stosujesz odpowiednie mechanizmy synchronizacji, aby upewnić się, że wykonano tylko jedno wywołanie Close metody lub Dispose . Metoda ReleaseHandle nie zostanie wywołana, jeśli IsInvalid właściwość lub IsClosed ma true
wartość . Zaimplementuj tę metodę w CriticalHandle klasach pochodnych, aby wykonać dowolny kod wymagany do zwolnienia dojścia. Ponieważ jedną z funkcji programu CriticalHandle jest zagwarantowanie zapobiegania wyciekom zasobów, kod w implementacji ReleaseHandle programu nie może zakończyć się niepowodzeniem. Wywołania ReleaseHandle modułu odśmiecywania pamięci po normalnych finalizatorach zostały uruchomione dla obiektów, które zostały w tym samym czasie odebrane, i gwarantuje, że zasoby do jego wywołania i nie zostaną przerwane, gdy będzie w toku. Ta metoda zostanie przygotowana jako ograniczony region wykonywania (CER) w czasie budowy wystąpienia (wraz ze wszystkimi metodami w statycznie determinowalnym grafie wywołań). Mimo że zapobiega to przerwaniu wątków, nadal należy zachować ostrożność, aby nie wprowadzać żadnych ścieżek błędów w metodzie zastępowanej ReleaseHandle . W szczególności należy zastosować ReliabilityContractAttribute atrybut do wszystkich metod wywoływanych z ReleaseHandleklasy . W większości przypadków ten kod powinien być następujący:
ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)
Ponadto w celu prostego czyszczenia (na przykład wywoływania interfejsu API CloseHandle
systemu Windows w dojściu plików) 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 metoda zostanie zwrócona ReleaseHandlefalse
z jakiegokolwiek powodu, wygeneruje asystenta debugowania zarządzanego releaseHandleFailed .
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