SafeHandle.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.
Exemplos
O exemplo de código a seguir libera o identificador e faz parte de um exemplo maior fornecido para a SafeHandle classe .
[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 . Implemente esse método em suas SafeHandle classes derivadas para executar qualquer código necessário para liberar o identificador. Como uma das funções de SafeHandle é 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. O coletor de lixo garante que os recursos invoquem esse método e que o método não será interrompido enquanto ele estiver em andamento.
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 ReleaseHandle retornar false
por qualquer motivo, ele gerará um Assistente de Depuração Gerenciada releaseHandleFailed ao ser executado no .NET Framework. Isso ajuda a detectar casos em que sua tentativa de liberar recursos falha.