2012-10-04 3 views
2

:.NET에서 GC.WaitForPendingFinalizers()가 차단되는 상황은 무엇입니까? <a href="http://msdn.microsoft.com/library/system.gc.waitforpendingfinalizers.aspx" rel="nofollow">GC.WaitForPendingFinalizers()</a>의 MSDN 문서에서 인용

파이널 라이저가 실행되는 스레드가 지정되어 있지 않은, 그래서이 방법은 종료 것이라는 보장은 없습니다.

나는이 문장을 정말로 이해하지 못한다. 어떤 상황에서이 방법이 종료되지 않습니까? 그리고 이것은 파이널 라이저가 실행되는 스레드와 어떤 관련이 있습니까? 스레드가 "지정되지 않음"이라고 명시하는 이유는 무엇입니까? 종료 자 스레드에 관한

, 나는 다음과 같은 올바른 가정 (?) 만 하나 종료 자 스레드있다

  • .
  • finalizer는 항상 별도의 스레드에서 실행됩니다 (즉, 메인 스레드 나 다른 사용자가 만든 스레드에서 실행되지 않음).

참고 : 나는 파이 나라 블록 중 하나지만,이 문제가 파이 나라를 위해 사용되는 어떤 스레드에 상관없이 존재하지 않는 경우에이 방법을 차단합니다 상상할 수있다.

답변

2

:

는 finalize 메소드가 완료 될 때까지 실행되지 않을 수 있습니다 또는 모두 다음과 같은 예외적 인 상황에 에서 실행되지 않을 수 있습니다

:

  • 또 다른 종료 자 블록 무기한 (무한로 전환 루프에서 은 결코 얻을 수없는 잠금을 얻으려고 시도합니다. 런타임이 완료자를 완료하려고 시도하므로 finalizer가 무기한 차단되면 다른 finalizer 이 호출되지 않을 수 있습니다.

  • 런타임이 을 정리할 기회없이 종료됩니다. 이 경우 런타임 프로세스의 런타임 알림은 DLL_PROCESS_DETACH 알림입니다.

+1

그래, 그럼 왜 문서가 명시 적으로 "finalizers가 실행 스레드가 지정되지 않은"상태?"이 메소드가 종료됩니다 (finalizer를 차단하기 때문에) 보장 할 수는 없습니다"라고 쓰는 것으로 충분하지 않습니까? –

+2

CLR 팀은 향후 구현 세부 사항을 변경할 권리가 있으며, 현재 작동 방식에 의의를두고 싶지는 않습니다. 사실은 자체 스레드 (GC.Collect가 아닌)에서 실행된다는 것입니다. –

+1

리히터의 CLR에서 C#을 통해, 나는 그가 미래에 CLR이 여러 개의 파이널 라이저 스레드를 사용할 수 있다고 언급했다. 나는이 책을 편리하게 가지고 있지는 않지만, 당신의 질문에 더 잘 답할 수있는 심층적 인 토론이 발견 될 것이라고 생각합니다. –

1

먼저 일반적으로 SuppressFinalize를 제외하고는 GC 클래스에서 메소드를 사용할 필요가 없습니다. 다른 방법의 대부분은 일반적으로 응용 프로그램이 최악의 성능을 보입니다.

그러나 질문에 대답하기 위해 수집이 수행 될 때 실행되는 종료 자의 가비지 수집기가 보유한 내부 목록이 있다는 것을 알고있는 한 이 모두 같은 스레드에서 차례대로 실행됩니다. 즉, 하나의 파이널 라이저 블록이 있다면이 방법도 차단 될 것입니다.

앱 도메인이 종료되면 모든 종료 기가 완료되는 데 시간 제한이 있으며이 경우에는 별 문제가되지 않습니다. another article on MSDN에서

+0

Richard Morgan의 답변에 대한 의견을 참조하십시오. –