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.

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

Retours

Boolean

true si la libération du handle réussit ; sinon, dans le cas d’un échec catastrophique, false. Dans ce cas, elle génère un Assistant Débogage managé releaseHandleFailed.

Exemples

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

Remarques

La ReleaseHandle méthode est garantie d’être appelée une seule fois et uniquement si le handle est valide comme défini par la IsInvalid propriété. Implémentez cette méthode dans vos SafeHandle classes dérivées pour exécuter tout code requis pour libérer le handle. Étant donné que l’une des fonctions suivantes SafeHandle consiste à garantir la prévention des fuites de ressources, le code de votre implémentation ne ReleaseHandle doit jamais échouer. Les appels ReleaseHandle de garbage collector après les finaliseurs normaux ont été exécutés pour les objets qui ont été collectés simultanément. 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. Cette méthode est préparée en tant que région d’exécution contrainte (CER) au moment de la construction de l’instance (ainsi que toutes les méthodes de son graphique d’appel déterminable statiquement). Bien que cela empêche les interruptions de thread, vous devez toujours veiller à ne pas introduire de chemins d’erreur dans votre méthode substituée ReleaseHandle . En particulier, appliquez l’attribut ReliabilityContractAttribute à toutes les méthodes que vous appelez à partir de ReleaseHandle. Dans la plupart des cas, ce code doit être :

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

En outre, pour un nettoyage simple (par exemple, l’appel de l’API CloseHandle Windows sur un handle de fichier), vous pouvez vérifier la valeur de retour de l’appel d’appel de plateforme unique. Pour un nettoyage complexe, vous pouvez avoir beaucoup de logique de programme et de nombreux appels de méthode, dont certains peuvent échouer. Vous devez vous assurer que la logique de votre programme dispose d’un code de secours pour chacun de ces cas.

Si ReleaseHandle elle est retournée false pour une raison quelconque, elle génère un Assistant débogage managé releaseHandleFailed . Cela vous permet de détecter les cas où votre tentative de libération des ressources échoue.

S’applique à

Voir aussi