2010-06-22 7 views
2

문제가 발생했습니다. PerformanceCounter 개체를 래핑하는 싱글 톤 도우미 개체를 만듭니다. 그것은 IDisposable을 구현합니다 ...하지만 지금 나는 테스트 샘플 호스트 어플리케이션을 닫을 때 카운터가 perfmon 도구 (Windows 서비스에서 호스트 될 생산 단계)에서 여전히 볼 수 있으며 여전히 실행 중임을 발견했습니다.응용 프로그램이 충돌 할 때 처리하는 방법

나는 Dispose가 finalizer 내부에서 호출되지만, 나는 PerformanceCounter 객체 인 관리 자원을 처리하지 않는다는 것을 알았습니다. 자원을 적절하게 확보하려면 어떻게해야합니까?

감사합니다, 파블 당신은 일회용 패턴을 사용하는 경우 아래의 코드를 볼 수

답변

1

이것은 성능 카운터의 일반적인 동작입니다. 프로세스가 데이터를 생성하지 않는 경우에도 존재하는 전역 "객체"입니다. 예를 들어 컴퓨터에서 하나의 .NET 프로그램이 실행되고 있지 않더라도 .NET 성능 카운터 중 하나를 선택할 수 있습니다. 더 이상 실행중인 프로세스가 없어도 카운터가 데이터를 생성하는 경우 부적합한 CounterType을 선택했을 수 있습니다.

InstanceLifetime 속성을 검토하여 프로세스 값이 카운터에 적합한 지 확인하십시오.

+0

그게 내가 찾고 있었던 것이다. 내 카운터는 엄격하게 인스턴스와 관련이 있으므로 프로세스가 종료되면 폐기해야합니다. 모드 란 무엇입니까? MultiInstance 방식을 사용합니다. 감사합니다. – dragonfly

+0

어, 나는 일찍 행복했다 :) 카운터의 InstanceLifetime은 Global이다. 하지만 알 수없는, 프로세스로 변경하는 방법 :/ 아이디어가 있으십니까? – dragonfly

+0

예외 : InstanceLifetime은 인스턴스가 초기화 된 후에 설정할 수 없습니다. RawValue를 설정하기 전에 기본 생성자를 사용하고 CategoryName, InstanceName, CounterName, InstanceLifetime 및 ReadOnly 속성을 수동으로 설정해야합니다. – dragonfly

1

확인합니다. finalizer는 dispose 메서드를 명시 적으로 호출해야합니다.

class DisposableObject : IDisposable 
{ 
    public void Dispose() 
    { 
     this.Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      // dispose managed resources 
     } 
     // dispose unmanaged resources 
    } 

    ~DisposableObject() 
    { 
     this.Dispose(false); 
    } 
} 
+0

Yeap. 나는 그 패턴을 따르고, 참 처분 코드는 아래에있다. // 관리 자원을 처분한다 코멘트. 그래서 응용 프로그램을 닫을 때 finalizer가 호출되고 disposing이 false로 설정됩니다. – dragonfly

+0

@dragonfly - 응용 프로그램이 충돌 할 경우 finalizer가 호출되지 않을 수도 있습니다. object.Finalize 메서드의 비고 섹션을 참조하십시오. http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx – tvanfosson

+0

더 나은 : thx. – dragonfly

2

응용 프로그램이 충돌하는 경우 관리되지 않는 리소스가 삭제되었는지 확인할 수있는 방법이 많지 않습니다. 개체가 마무리 될 때 관리되지 않는 리소스가 삭제 된 경우이를 사용하여 일회용 패턴을 올바르게 구현해야합니다. 이 방법으로 서비스가 종료 될 때 리소스를 해제하지만 하드 충돌이 발생하면 코드가 실행되지 않을 수 있습니다.

특히 코드를 자동으로 다시 시작하는 Windows 서비스에서 호스팅하는 경우 충돌이 예상되는 코드를 작성하고 관리되지 않는 리소스를 그대로두고 재사용/재 확보하는 경우 가능한. 그 짧은 경우, 당신은 또한 모든 충돌이 희귀하고 (그리고 당신의 통제를 넘어서는) 확실히하기 위해 프로그래밍에서 매우 방어 적이어야합니다.

관련 문제