SafeHandle.ReleaseHandle Metodo

Definizione

Quando ne viene eseguito l'override in una classe derivata, esegue il codice necessario per liberare l'handle.

protected:
 abstract bool ReleaseHandle();
protected abstract bool ReleaseHandle ();
abstract member ReleaseHandle : unit -> bool
Protected MustOverride Function ReleaseHandle () As Boolean

Restituisce

Boolean

true se l'handle viene rilasciato correttamente; in caso contrario, se si verifica un errore irreversibile, false. In questo caso, genera un assistente al debug gestito releaseHandleFailed.

Esempio

Nell'esempio di codice seguente viene rilasciato l'handle e fa parte di un esempio più ampio fornito per la SafeHandle classe .

[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

È garantito che il ReleaseHandle metodo venga chiamato una sola volta e solo se l'handle è valido come definito dalla IsInvalid proprietà . Implementare questo metodo nelle SafeHandle classi derivate per eseguire qualsiasi codice necessario per liberare l'handle. Poiché una delle funzioni di è quella di SafeHandle garantire la prevenzione delle perdite di risorse, il codice nell'implementazione di ReleaseHandle non deve mai avere esito negativo. Il Garbage Collector chiama ReleaseHandle dopo l'esecuzione dei normali finalizzatori per gli oggetti che sono stati raccolti contemporaneamente. Il Garbage Collector garantisce le risorse per richiamare questo metodo e che il metodo non verrà interrotto mentre è in corso. Questo metodo verrà preparato come area di esecuzione vincolata (CER) in fase di costruzione dell'istanza (insieme a tutti i metodi nel grafico delle chiamate determinabili in modo statico). Sebbene ciò impedisca interruzioni di thread, è comunque necessario prestare attenzione a non introdurre percorsi di errore nel metodo sottoposto ReleaseHandle a override. In particolare, applicare l'attributo ReliabilityContractAttribute a qualsiasi metodo chiamato da ReleaseHandle. Nella maggior parte dei casi questo codice deve essere:

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

Inoltre, per la pulizia semplice (ad esempio, chiamando l'API CloseHandle Windows in un handle di file) è possibile controllare il valore restituito per la singola chiamata platform invoke. Per la pulizia complessa, potrebbe essere disponibile una grande logica di programma e molte chiamate di metodo, alcune delle quali potrebbero avere esito negativo. È necessario assicurarsi che la logica del programma abbia codice di fallback per ognuno di questi casi.

Se ReleaseHandle restituisce false per qualsiasi motivo, genera un Assistente debug gestito releaseHandleFailed . Ciò consente di rilevare i casi in cui il tentativo di rilasciare le risorse ha esito negativo.

Si applica a

Vedi anche