SafeHandle.ReleaseHandle 메서드

정의

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

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

반환

Boolean

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

예제

다음 코드 예제에서는 핸들을 해제 하 고 클래스에 제공 된 더 큰 예제의 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.
}

설명

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

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

또한 간단한 정리(예: 파일 핸들에서 Windows API CloseHandle 호출)의 경우 단일 플랫폼 호출에 대한 반환 값을 확인할 수 있습니다. 복잡한 정리의 경우 많은 프로그램 논리와 많은 메서드 호출이 있을 수 있으며, 그 중 일부는 실패할 수 있습니다. 각 사례에 대한 대체 코드가 프로그램 논리에 있는지 확인해야 합니다.

어떤 이유로든 반환 false 되면 ReleaseHandle releaseHandleFailed 관리 디버깅 도우미가 생성됩니다. 이렇게 하면 리소스를 해제하려는 시도가 실패하는 경우를 감지할 수 있습니다.

적용 대상

추가 정보