SafeHandle.ReleaseHandle Méthode

Définition

En cas de substitution dans une classe dérivée, exécute le code nécessaire pour libérer le 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

Retours

true si la libération du handle réussit ; sinon, dans le cas d’un échec catastrophique, false.true if the handle is released successfully; otherwise, in the event of a catastrophic failure, false. Dans ce cas, elle génère un Assistant Débogage managé releaseHandleFailed.In this case, it generates a releaseHandleFailed Managed Debugging Assistant.

Exemples

L’exemple de code suivant libère le handle et fait partie d’un exemple plus complet fourni SafeHandle pour la classe.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.
}

Remarques

La ReleaseHandle méthode est systématiquement appelée une seule fois et uniquement si le handle est valide comme défini par la IsInvalid propriété.The ReleaseHandle method is guaranteed to be called only once and only if the handle is valid as defined by the IsInvalid property. Implémentez cette méthode dans SafeHandle vos classes dérivées pour exécuter tout code requis pour libérer le handle.Implement this method in your SafeHandle derived classes to execute any code that is required to free the handle. Étant donné que l’une des SafeHandle fonctions de est de garantir la prévention des fuites de ressources, le code ReleaseHandle de votre implémentation de ne doit jamais échouer.Because one of the functions of SafeHandle is to guarantee prevention of resource leaks, the code in your implementation of ReleaseHandle must never fail. Les appels ReleaseHandle du récupérateur de mémoire après l’exécution des finaliseurs normaux pour les objets qui ont été récupérés par le garbage collector en même temps.The garbage collector calls ReleaseHandle after normal finalizers have been run for objects that were garbage collected at the same time. Le garbage collector garantit que les ressources appellent cette méthode et que la méthode ne sera pas interrompue pendant qu’elle est en cours.The garbage collector guarantees the resources to invoke this method and that the method will not be interrupted while it is in progress. Cette méthode sera préparée comme une région d’exécution limitée (CER) au moment de la construction de l’instance (avec toutes les méthodes dans son graphique des appels déterminables statiquement).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). Bien que cela empêche les interruptions d’abandon de thread, vous devez toujours veiller à ne pas introduire de chemins d' ReleaseHandle erreur dans votre méthode substituée.Although this prevents thread abort interrupts, you must still be careful not to introduce any fault paths in your overridden ReleaseHandle method. En particulier, appliquez l' ReliabilityContractAttribute attribut à toute méthode que vous appelez ReleaseHandleà partir de.In particular, apply the ReliabilityContractAttribute attribute to any methods you call from ReleaseHandle. Dans la plupart des cas, ce code doit être :In most cases this code should be:

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

En outre, pour un nettoyage simple (par exemple, l’appel de CloseHandle l’API Windows sur un descripteur de fichier), vous pouvez vérifier la valeur de retour pour l’appel d’appel de code non managé unique.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. Pour un nettoyage complexe, vous pouvez avoir beaucoup de logique de programme et de nombreux appels de méthode, dont certains peuvent échouer.For complex cleanup, you may have a lot of program logic and many method calls, some of which might fail. Vous devez vous assurer que la logique de votre programme contient du code de secours pour chacun de ces cas.You must ensure that your program logic has fallback code for each of those cases.

Si ReleaseHandle retournefalse pour une raison quelconque, il génère un Assistant Débogage managé ReleaseHandleFailed .If ReleaseHandle returns false for any reason, it generates a releaseHandleFailed Managed Debugging Assistant. Cela vous permet de détecter les cas où la tentative de libération des ressources échoue.This helps you detect cases where your attempt to release resources fails.

Sécurité

SecurityPermission
pour obtenir l’autorisation d’appeler du code non managé.for permission to call unmanaged code. Action de sécurité LinkDemand:.Security action: LinkDemand. Énumération associée:UnmanagedCodeAssociated enumeration: UnmanagedCode

S’applique à

Voir aussi