SafeHandle.ReleaseHandle Método

Definición

Cuando se invalida en una clase derivada, ejecuta el código necesario para liberar el identificador.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

Devoluciones

true si el identificador se libera correctamente; en caso contrario, si se produce un error grave, false.true if the handle is released successfully; otherwise, in the event of a catastrophic failure, false. En este caso, genera un Asistente para depuración administrada releaseHandleFailed.In this case, it generates a releaseHandleFailed Managed Debugging Assistant.

Ejemplos

En el ejemplo de código siguiente se libera el identificador y forma parte de un ejemplo más SafeHandle extenso proporcionado para la clase.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.
}

Comentarios

Se ReleaseHandle garantiza que se llamará al método solo una vez y solo si el identificador es válido tal y IsInvalid como se define en la propiedad.The ReleaseHandle method is guaranteed to be called only once and only if the handle is valid as defined by the IsInvalid property. Implemente este método en SafeHandle las clases derivadas para ejecutar cualquier código necesario para liberar el identificador.Implement this method in your SafeHandle derived classes to execute any code that is required to free the handle. Dado que una de las funciones SafeHandle de es garantizar la prevención de pérdidas de recursos, el código de la implementación ReleaseHandle de nunca debe producir un error.Because one of the functions of SafeHandle is to guarantee prevention of resource leaks, the code in your implementation of ReleaseHandle must never fail. El recolector de ReleaseHandle elementos no utilizados llama a después de que se hayan ejecutado los finalizadores normales para los objetos que se han recolectado al mismo tiempo.The garbage collector calls ReleaseHandle after normal finalizers have been run for objects that were garbage collected at the same time. El recolector de elementos no utilizados garantiza que los recursos invoquen este método y que el método no se interrumpirá mientras esté en curso.The garbage collector guarantees the resources to invoke this method and that the method will not be interrupted while it is in progress. 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).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). Aunque esto evita interrupciones de anulación de subprocesos, debe tener cuidado de no introducir rutas de acceso de ReleaseHandle error en el método invalidado.Although this prevents thread abort interrupts, you must still be careful not to introduce any fault paths in your overridden ReleaseHandle method. En concreto, aplique el ReliabilityContractAttribute atributo a cualquier método al que llame ReleaseHandledesde.In particular, apply the ReliabilityContractAttribute attribute to any methods you call from ReleaseHandle. En la mayoría de los casos, este código debe ser:In most cases this code should be:

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

Además, para la limpieza simple (por ejemplo, al llamar a CloseHandle la API de Windows en un identificador de archivo), puede comprobar el valor devuelto para la llamada de invocación de plataforma única.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. En el caso de la limpieza compleja, puede tener mucha lógica de programa y muchas llamadas a métodos, algunas de las cuales podrían producir un error.For complex cleanup, you may have a lot of program logic and many method calls, some of which might fail. Debe asegurarse de que la lógica del programa tenga código de reserva para cada uno de estos casos.You must ensure that your program logic has fallback code for each of those cases.

Si ReleaseHandle por cualquier motivo, genera un asistente para la depuración administrada de ReleaseHandleFailed. falseIf ReleaseHandle returns false for any reason, it generates a releaseHandleFailed Managed Debugging Assistant. Esto le ayuda a detectar los casos en los que se produce un error al intentar liberar recursos.This helps you detect cases where your attempt to release resources fails.

Seguridad

SecurityPermission
para obtener permiso para llamar a código no administrado.for permission to call unmanaged code. Acción de seguridad LinkDemand:.Security action: LinkDemand. Enumeración asociada:UnmanagedCodeAssociated enumeration: UnmanagedCode

Se aplica a

Consulte también: