SafeHandle.ReleaseHandle 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
파생 클래스에서 재정의된 경우 핸들을 해제하는 데 필요한 코드를 실행합니다.
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 관리 디버깅 도우미가 생성됩니다. 이렇게 하면 리소스를 해제하려는 시도가 실패하는 경우를 감지할 수 있습니다.
적용 대상
추가 정보
.NET