CriticalHandle.ReleaseHandle Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Quando substituído em uma classe derivada, executa o código necessário para liberar o identificador.
protected:
abstract bool ReleaseHandle();
protected abstract bool ReleaseHandle ();
abstract member ReleaseHandle : unit -> bool
Protected MustOverride Function ReleaseHandle () As Boolean
Retornos
true
se o identificador for liberado com êxito, caso contrário, no caso de uma falha catastrófica, false
. Nesse caso, ele gera um Assistente para Depuração Gerenciada de releaseHandleFailed.
Comentários
O ReleaseHandle método tem a garantia de ser chamado apenas uma vez, desde que você empregue mecanismos de sincronização adequados para garantir que apenas uma chamada para o Close método ou Dispose seja feita. O ReleaseHandle método não será chamado se a IsInvalid propriedade ou IsClosed for true
. Implemente esse método em suas CriticalHandle classes derivadas para executar qualquer código necessário para liberar o identificador. Como uma das funções de CriticalHandle é garantir a prevenção de vazamentos de recursos, o código em sua implementação de ReleaseHandle nunca deve falhar. O coletor de lixo chama ReleaseHandle depois que os finalizadores normais são executados para objetos que foram coletados ao mesmo tempo e garante que os recursos o invoquem e que ele não será interrompido enquanto estiver em andamento. 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 estaticamente determinável). Embora isso impeça interrupções de anulação de thread, você ainda deve ter cuidado para não introduzir nenhum caminho de falha em seu método substituído ReleaseHandle . Em particular, aplique o atributo a todos os ReliabilityContractAttribute métodos que você chamar de ReleaseHandle. Na maioria dos casos, esse código deve ser:
ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)
Além disso, para limpeza simples (por exemplo, chamando a API CloseHandle
do Windows em um identificador de arquivo), você pode verificar o valor retornado para a chamada de invocação de plataforma única. Para limpeza complexa, você pode ter muita lógica de programa e muitas chamadas de método, algumas das quais podem falhar. Você deve garantir que a lógica do programa tenha código de fallback para cada um desses casos.
Se o ReleaseHandle método retornar false
por qualquer motivo, ele gerará um assistente de depuração gerenciada releaseHandleFailed .