SafeHandle.ReleaseHandle Método

Definição

Quando substituído em uma classe derivada, executa o código necessário para liberar o 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

Retornos

Boolean

true se o identificador for liberado com êxito, caso contrário, no caso de uma falha catastrófica, false.true if the handle is released successfully; otherwise, in the event of a catastrophic failure, false. Nesse caso, ele gera um Assistente para Depuração Gerenciada de releaseHandleFailed.In this case, it generates a releaseHandleFailed Managed Debugging Assistant.

Exemplos

O exemplo de código a seguir libera o identificador e faz parte de um exemplo maior fornecido para a SafeHandle classe.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.
}

Comentários

ReleaseHandleÉ garantido que o método seja chamado apenas uma vez e somente se o identificador for válido conforme definido pela IsInvalid propriedade.The ReleaseHandle method is guaranteed to be called only once and only if the handle is valid as defined by the IsInvalid property. Implemente esse método em suas SafeHandle classes derivadas para executar qualquer código que seja necessário para liberar o identificador.Implement this method in your SafeHandle derived classes to execute any code that is required to free the handle. Como uma das funções do SafeHandle é garantir a prevenção de vazamentos de recursos, o código em sua implementação do ReleaseHandle nunca deve falhar.Because one of the functions of SafeHandle is to guarantee prevention of resource leaks, the code in your implementation of ReleaseHandle must never fail. As chamadas do coletor de lixo ReleaseHandle após os finalizadores normais foram executadas para objetos que foram coletados como lixo ao mesmo tempo.The garbage collector calls ReleaseHandle after normal finalizers have been run for objects that were garbage collected at the same time. O coletor de lixo garante que os recursos invoquem esse método e que o método não será interrompido enquanto estiver em andamento.The garbage collector guarantees the resources to invoke this method and that the method will not be interrupted while it is in progress. Esse método será preparado como uma CER (região de execução restrita) no tempo de construção da instância (juntamente com todos os métodos em seu grafo de chamada estáticomente determinável).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). Embora isso impeça as interrupções de anulação de thread, você ainda deve ter cuidado para não introduzir nenhum caminho de falha em seu ReleaseHandle método substituído.Although this prevents thread abort interrupts, you must still be careful not to introduce any fault paths in your overridden ReleaseHandle method. Em particular, aplique o ReliabilityContractAttribute atributo a qualquer método de sua chamada ReleaseHandle .In particular, apply the ReliabilityContractAttribute attribute to any methods you call from ReleaseHandle. Na maioria dos casos, esse código deve ser:In most cases this code should be:

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

Além disso, para uma limpeza simples (por exemplo, chamar a API do Windows CloseHandle em um identificador de arquivo), você pode verificar o valor de retorno para a chamada de invocação 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. Para uma limpeza complexa, você pode ter muita lógica do programa e muitas chamadas de método, algumas das quais podem falhar.For complex cleanup, you may have a lot of program logic and many method calls, some of which might fail. Você deve garantir que a lógica do programa tenha o código de fallback para cada um desses casos.You must ensure that your program logic has fallback code for each of those cases.

Se ReleaseHandle false o retornar por qualquer motivo, ele gerará um assistente de depuração gerenciada do releaseHandleFailed .If ReleaseHandle returns false for any reason, it generates a releaseHandleFailed Managed Debugging Assistant. Isso ajuda a detectar casos em que a tentativa de liberar recursos falha.This helps you detect cases where your attempt to release resources fails.

Aplica-se a