Compartir vía


SafeHandle.ReleaseHandle Método

Definición

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.

Ejemplos

En el ejemplo de código siguiente se libera el identificador y forma parte de un ejemplo más grande proporcionado para la SafeHandle clase .

[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.
}

Comentarios

Se ReleaseHandle garantiza que el método se llame solo una vez y solo si el identificador es válido según lo definido por la IsInvalid propiedad . Implemente este método en las SafeHandle clases derivadas para ejecutar cualquier código necesario para liberar el identificador. Dado que una de las funciones de SafeHandle 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. El recolector de elementos no utilizados garantiza los recursos para invocar este método y que el método no se interrumpirá mientras está en curso.

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 ReleaseHandle devuelve false por cualquier motivo, genera un Asistente para depuración administrada releaseHandleFailed cuando se ejecuta en .NET Framework. Esto le ayuda a detectar casos en los que se produce un error en el intento de liberar recursos.

Se aplica a

Consulte también