CriticalHandle.ReleaseHandle Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Cuando se invalida en una clase derivada, ejecuta el código necesario para liberar el identificador.
protected:
abstract bool ReleaseHandle();
protected abstract bool ReleaseHandle ();
abstract member ReleaseHandle : unit -> bool
Protected MustOverride Function ReleaseHandle () As Boolean
Devoluciones
true
si el identificador se libera correctamente; en caso contrario, si se produce un error grave, false
. En este caso, genera un Asistente para depuración administrada releaseHandleFailed.
Comentarios
Se ReleaseHandle garantiza que el método se llame solo una vez, siempre que se utilicen mecanismos de sincronización adecuados para asegurarse de que solo se realiza una llamada al Close método o Dispose . No se llamará al ReleaseHandle método si la IsInvalid propiedad o IsClosed es true
. Implemente este método en las CriticalHandle 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 llama ReleaseHandle después de que se hayan ejecutado finalizadores normales para los objetos que se recopilaron como elementos no utilizados al mismo tiempo y garantiza que los recursos lo invoquen y que no se interrumpirán mientras está en curso. Este método se preparará como una región de ejecución restringida (CER) en el momento de la construcción de la instancia (junto con todos los métodos de su gráfico de llamadas determinable estáticamente). Aunque esto evita interrupciones de anulación de subprocesos, debe tener cuidado de no introducir ninguna ruta de acceso de error en el método invalidado ReleaseHandle . En concreto, aplique el ReliabilityContractAttribute atributo a cualquier método al que llame desde ReleaseHandle. En la mayoría de los casos, este código debe ser:
ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)
Además, para una limpieza simple (por ejemplo, llamar a la API CloseHandle
de Windows en un identificador de archivo), puede comprobar el valor devuelto para la llamada de invocación de plataforma única. En el caso de la limpieza compleja, es posible que tenga una gran cantidad de lógica de programa y muchas llamadas a métodos, algunas de las cuales podrían 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 asistente de depuración administrada releaseHandleFailed .