이 설명서는 보관되지만 유지 되지 않습니다.

SafeHandle.ReleaseHandle 메서드

업데이트: 2007년 11월

파생 클래스에서 재정의된 경우 핸들을 해제하는 데 필요한 코드를 실행합니다.

네임스페이스:  System.Runtime.InteropServices
어셈블리:  mscorlib(mscorlib.dll)

protected abstract bool ReleaseHandle()
protected abstract boolean ReleaseHandle()
protected abstract function ReleaseHandle() : boolean

반환 값

형식: System.Boolean

핸들이 성공적으로 해제되면 true이고, 심각한 오류가 발생하면 false입니다. 이러한 경우 releaseHandleFailed MDA 관리 디버깅 도우미가 생성됩니다.

ReleaseHandle 메서드는 핸들이 IsInvalid 속성에 정의된 대로 유효한 경우에만 딱 한 번 호출되도록 합니다. 핸들을 해제하는 데 필요한 코드를 실행하려면 SafeHandle 파생 클래스에 이 메서드를 구현합니다. SafeHandle의 기능 중 하나는 리소스 누수 방지이므로 구현된 ReleaseHandle의 코드가 실패하면 안 됩니다. 동시에 가비지 수집된 개체에 대해 일반 종료자가 실행된 후 가비지 수집기가 ReleaseHandle을 호출합니다. 가비지 수집기는 리소스가 이 메서드를 호출하고 진행 과정에서 메서드가 중단되지 않도록 합니다. 이 메서드와 이 메서드의 정적으로 결정할 수 있는 호출 그래프에 포함된 모든 메서드는 인스턴스를 생성할 때 CER(제약이 있는 실행 영역)로 준비됩니다. 이로 인해 스레드 중단은 기본적으로 방지되지만 재정의한 ReleaseHandle 메서드에 잘못된 경로를 지정하지 않도록 주의해야 합니다. 특히 ReleaseHandle에서 호출하는 모든 메서드에는 ReliabilityContractAttribute 특성을 적용해야 합니다. 일반적으로 코드는 다음과 같습니다.

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

또한 파일 핸들에 대해 Win32 API CloseHandle을 호출하는 것과 같이 간단한 정리 작업을 수행하는 경우에는 단일 P/Invoke 호출의 반환 값을 확인할 수 있습니다. 복잡한 정리 작업에는 여러 가지 프로그램 논리와 메서드 호출이 포함될 수 있으며 이 중 일부가 실패할 수 있습니다. 프로그램 논리에는 이러한 각 경우에 대한 대체 코드가 있어야 합니다.

ReleaseHandlefalse를 반환하면 releaseHandleFailed MDA 관리 디버깅 도우미가 생성됩니다. 관리 디버깅 도우미는 실패한 리소스 해제 작업을 찾는 데 도움이 됩니다.

다음 코드 예제는 SafeHandle 클래스에 대해 제공되는 더 큰 예제의 일부이며 핸들을 해제합니다.

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


Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

.NET Framework 및 .NET Compact Framework에서 모든 플랫폼의 전체 버전을 지원하지는 않습니다. 지원되는 버전의 목록을 보려면 .NET Framework 시스템 요구 사항을 참조하십시오.

.NET Framework

3.5, 3.0, 2.0에서 지원
표시: