Compartilhar via


Método SafeHandle.ReleaseHandle ()

 

Dica

The .NET API Reference documentation has a new home. Visit the .NET API Browser on docs.microsoft.com to see the new experience.

Quando substituído em uma classe derivada, executa o código necessário para liberar o identificador.

Namespace:   System.Runtime.InteropServices
Assembly:  mscorlib (em mscorlib.dll)

Sintaxe

protected abstract bool ReleaseHandle()
protected:
virtual bool ReleaseHandle() abstract
abstract ReleaseHandle : unit -> bool
Protected MustOverride Function ReleaseHandle As Boolean

Valor Retornado

Type: System.Boolean

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 MDA releaseHandleFailed.

Comentários

O ReleaseHandle é garantido que método ser chamado somente uma vez e apenas se o identificador é válido conforme definido pelo IsInvalid propriedade. Implementar esse método no seu SafeHandle derivadas de classes para executar qualquer código que é necessário para liberar o identificador. Porque uma das funções de SafeHandle é garantir a prevenção de perda de recursos, o código em sua implementação de ReleaseHandle nunca deve falhar. O coletor de lixo chama ReleaseHandleapós a execução de finalizadores normais para objetos que foram limpos ao mesmo tempo. O coletor de lixo garante os recursos para invocar esse método e que o método não será interrompido enquanto ele está em andamento. Esse método será preparado como uma região de execução restrita (CER) no tempo de construção da instância (junto com todos os métodos em seu gráfico de chamada estaticamente determinável). Embora isso impede que as interrupções de anulação de thread, você ainda deve ter cuidado para não incluir todos os caminhos falhas no seu substituído ReleaseHandle método. Em particular, se aplicam a ReliabilityContractAttribute a qualquer método que você chamar a partir de atributo ReleaseHandle. Na maioria dos casos, esse código deve ser:

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

Além disso, para limpeza simple (por exemplo, chamar a API do Win32 CloseHandle em um identificador de arquivo) você pode verificar o valor de retorno de 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. Certifique-se de que sua lógica de programa tem código de retorno para cada um desses casos.

Se ReleaseHandle retorna false por qualquer motivo, ele gera um MDA releaseHandleFailed Assistente de depuração gerenciada. Isso ajuda a detectar os casos em que a tentativa de liberar recursos falha.

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

Segurança

SecurityPermission

for permission to call unmanaged code. Security action: F:System.Security.Permissions.SecurityAction.LinkDemand. Associated enumeration: F:System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode

Informações de Versão

Plataforma Universal do Windows
Disponível desde 8
.NET Framework
Disponível desde 2.0
Biblioteca de Classes Portátil
Com suporte no: plataformas portáteis do .NET
Silverlight
Disponível desde 2.0
Windows Phone Silverlight
Disponível desde 7.0
Windows Phone
Disponível desde 8.1

Confira Também

Classe SafeHandle
Namespace System.Runtime.InteropServices
Diagnosticando erros com assistentes de depuração gerenciados
MDA releaseHandleFailed

Retornar ao início