SafeHandle.ReleaseHandle Metodo

Definizione

Quando ne viene eseguito l'override in una classe derivata, esegue il codice necessario per liberare l'handle.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

Restituisce

true se l'handle viene rilasciato correttamente; in caso contrario, se si verifica un errore irreversibile, false.true if the handle is released successfully; otherwise, in the event of a catastrophic failure, false. In questo caso, genera un assistente al debug gestito releaseHandleFailed.In this case, it generates a releaseHandleFailed Managed Debugging Assistant.

Esempi

L'esempio di codice seguente rilascia l'handle ed è parte di un esempio più ampio fornito per la classe 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.
}

Commenti

È garantita la chiamata al metodo ReleaseHandle solo una volta e solo se l'handle è valido come definito dalla proprietà IsInvalid.The ReleaseHandle method is guaranteed to be called only once and only if the handle is valid as defined by the IsInvalid property. Implementare questo metodo nelle classi derivate SafeHandle per eseguire qualsiasi codice necessario per liberare l'handle.Implement this method in your SafeHandle derived classes to execute any code that is required to free the handle. Poiché una delle funzioni di SafeHandle è garantire la prevenzione delle perdite di risorse, il codice nell'implementazione di ReleaseHandle non deve mai avere esito negativo.Because one of the functions of SafeHandle is to guarantee prevention of resource leaks, the code in your implementation of ReleaseHandle must never fail. Il Garbage Collector chiama ReleaseHandle dopo l'esecuzione dei finalizzatori normali per gli oggetti che sono stati sottoposti a Garbage Collection simultaneamente.The garbage collector calls ReleaseHandle after normal finalizers have been run for objects that were garbage collected at the same time. Il Garbage Collector garantisce le risorse per richiamare questo metodo e che il metodo non verrà interrotto mentre è in corso.The garbage collector guarantees the resources to invoke this method and that the method will not be interrupted while it is in progress. Questo metodo verrà preparato come area a esecuzione vincolata (CER) al momento della costruzione dell'istanza (insieme a tutti i metodi nel grafico delle chiamate che è possibile definire in modo statico).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). Sebbene questo impedisca l'interruzione del thread, è necessario prestare attenzione a non introdurre alcun percorso di errore nel metodo ReleaseHandle sottoposto a override.Although this prevents thread abort interrupts, you must still be careful not to introduce any fault paths in your overridden ReleaseHandle method. In particolare, applicare l'attributo ReliabilityContractAttribute a tutti i metodi chiamati da ReleaseHandle.In particular, apply the ReliabilityContractAttribute attribute to any methods you call from ReleaseHandle. Nella maggior parte dei casi il codice deve essere:In most cases this code should be:

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

Inoltre, per una pulizia semplice (ad esempio, la chiamata dell'API Windows CloseHandle su un handle di file), è possibile controllare il valore restituito per la singola chiamata di platform invoke.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. Per la pulizia complessa è possibile che si disponga di una grande quantità di logica di programma e di molte chiamate al metodo, alcune delle quali potrebbero avere esito negativo.For complex cleanup, you may have a lot of program logic and many method calls, some of which might fail. È necessario assicurarsi che la logica di programma disponga di codice di fallback per ognuno di questi casi.You must ensure that your program logic has fallback code for each of those cases.

Se ReleaseHandle restituisce false per qualsiasi motivo, genera un assistente al debug gestito releaseHandleFailed .If ReleaseHandle returns false for any reason, it generates a releaseHandleFailed Managed Debugging Assistant. Questo consente di rilevare i casi in cui il tentativo di rilasciare le risorse non riesce.This helps you detect cases where your attempt to release resources fails.

Sicurezza

SecurityPermission
per l'autorizzazione a chiamare codice non gestito.for permission to call unmanaged code. Azione di sicurezza: LinkDemand.Security action: LinkDemand. Enumerazione associata: UnmanagedCodeAssociated enumeration: UnmanagedCode

Si applica a

Vedi anche