Compartir a través de


Método CriticalHandle.ReleaseHandle ()

 

Publicado: noviembre de 2016

Cuando se invalida en una clase derivada, ejecuta el código necesario para liberar el identificador.

Espacio de nombres:   System.Runtime.InteropServices
Ensamblado:  mscorlib (en mscorlib.dll)

Sintaxis

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

Valor devuelto

Type: System.Boolean

true si el identificador se libera correctamente; en caso contrario, si se produce un error grave, false. En este caso, genera un Ayudante para la depuración administrada releaseHandleFailed MDA.

Comentarios

El ReleaseHandle método se garantiza que se llame solo una vez, siempre que emplee mecanismos de sincronización correcta para asegurarse de que sólo una llamada a la Close o Dispose se realiza el método. El ReleaseHandle método no se llamará si la IsInvalid o IsClosed propiedad es true. Implemente este método en su CriticalHandle sus clases derivadas para ejecutar cualquier código necesario para liberar el identificador. Dado que una de las funciones de CriticalHandle es garantizar la prevención de pérdidas de recursos, el código de la implementación de ReleaseHandle nunca debe producir un error. El recolector de elementos no utilizados llame ReleaseHandle después de que se han ejecutado los finalizadores normales para objetos que se recolecte al mismo tiempo, y garantiza que los recursos que lo invocan y que no se interrumpirá mientras está en curso. En el momento de construcción de la instancia (junto con todos los métodos en su gráfico de llamadas determinable estáticamente), se preparará este método como una región de ejecución restringida (CER). Aunque esto evita las interrupciones de anulación de subproceso, aún debe procurar no introducir ninguna ruta de acceso de error en su ReleaseHandle método. En particular, aplique el ReliabilityContractAttribute atributo a los métodos que llama desde ReleaseHandle. En la mayoría de los casos este código debería ser:

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

Además, para la limpieza sencilla (por ejemplo, al llamar a la API Win32 CloseHandle en un identificador de archivo) puede comprobar el valor devuelto de la llamada de invocación de la plataforma. Para la limpieza compleja, puede tener mucha lógica del programa y muchas llamadas a métodos, algunos de los cuales pueden producir un error. Debe asegurarse de que la lógica del programa tiene código de reserva para cada uno de esos casos.

Si el ReleaseHandle método devuelve false por cualquier motivo, genera un releaseHandleFailed MDA Ayudante de depuración administrada.

Información de versión

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 2.0
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 8.0
Windows Phone
Disponible desde 8.1

Ver también

Clase CriticalHandle
Espacio de nombres System.Runtime.InteropServices
Diagnosing Errors with Managed Debugging Assistants
releaseHandleFailed MDA

Volver al principio