다음을 통해 공유


SafeHandle.ReleaseHandle 메서드

정의

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

protected:
 abstract bool ReleaseHandle();
protected abstract bool ReleaseHandle ();
abstract member ReleaseHandle : unit -> bool
Protected MustOverride Function ReleaseHandle () As 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 합니다. 가비지 수집기는 리소스가 이 메서드를 호출하도록 보장하고 진행 중인 동안 메서드가 중단되지 않도록 합니다.

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

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

적용 대상

추가 정보