2015-01-30 5 views
1

IDisposable을 구현하는 개체가 있고 다른 개체와 관련된 Dispose에서 일부 작업을 수행하고 싶습니다. 이 작업이 어떻게 수행되는지 확신 할 수 있습니까? 현재 처리는 if 내부에서 수행됩니다. 나는 그걸 밖에서 꺼낼 수 없다. 맞지?어떤 지점에서 메서드 호출을 강제로 수행하는 방법

NB : _innerObject는 MyClass 인스턴스가 종료 된 후에도 계속 살거나 계속 살 수도 있습니다.

private OtherClass _innerObject; 
    ~MyClass() 
    { 
     Dispose(false); 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    private void Dispose(bool disposing) 
    { 
     if (_disposed) 
      return; 

     if (disposing) 
     { 
      _innerObject.DoSomeJob(); 
     } 
     _disposed = true; 
    } 
+0

"직업"이란 무엇을 의미합니까? –

+0

이 부분을 살펴보아야합니다. https://msdn.microsoft.com/en-us/library/system.object.finalize(v=vs.110).aspx –

+0

@AK_ 최종 결론은 제가 아닙니다. _innerObject 상태인지 확인하십시오. _innerObject를 MyClass의 정적 목록에 추가하고 Dispose가 완료되면 제거하려고합니다. 그러나 나는이 매우 깨끗한 것을 발견하지 못합니다 ... – Toto

답변

1

innerObject에 대한 호출은 무엇을 나타 냅니까?

종료 관련 방법의 경우 AppDomain에서 이벤트를 사용할 수 있습니다 (예 : ProcessExit/DomainUnload). MyClass와 관련된 리소스를 정리해야한다면 취해진 접근 방식을 취할 수 있지만 DoSomeJob이 호출 될 것이라는 보장은 없습니다. 또 다른 접근법은 코드 분석을 활성화하고 CA2000에서 실패하는 것입니다.

1

에는에 이러한 보증이 없습니다. IDisposable은 할 수있는 최선의 방법이지만, 생성 된 모든 인스턴스를 적절하게 처리하기 위해 유형의 소비자에게 의존합니다. 그렇지 않다면 실제로 할 수있는 일이 없습니다.

+0

Object.Finalize를 오버라이드하는 것 외에도 ... –

+0

@AK_ 생성 한 모든 객체를 마무리하지 않는 프로그램을 만드는 방법은 많습니다. 그리고 OP는 이미 파이널 라이저를 가지고 있습니다. 그것을 가지지 않는 것 위에 * 무언가를 더할 수 있지만, 여전히 보장에서 멀어집니다. – Servy

0

의견을 읽었을 때 _innerObject가 CriticalFinalizerObject에서 OtherClass를 상속하여 MyClass보다 먼저 finalize되지 않는다고 말할 수 있습니다. 하지만 이것은 약간의 해킹처럼 보입니다.

관련 문제