2009-09-25 2 views
2

일부 코드를 검토 중이며 코드 분석 (fxCop) 경고 중 하나가 매우 혼란 스럽습니다. 이에 대한 코드는 클래스의 시작 부분에 변수를 만들어 몇 mutex 년대를 구현하고, 유사한뮤텍스가 올바르게 구현되었으며 어떻게 처리합니까?

private Mutex myMutex = new Mutex(); 
의 FxCop 내가 뮤텍스 클래스가 구현과 클래스는 IDisposable을 구현해야한다는 메시지와 함께 진열되어

그것은 - 경고 CA1001입니다. 그러나 Mutex를 살펴보면 처리 방법이 없습니다.

뮤텍스가 SafeWaitHandle (이는 IDisposable을 구현합니다. 이것은 fxCop이 선택하는 것으로 추측합니다)이지만 뮤텍스는 표준 일회용 패턴을 통해이를 실제로 처리하지 않습니다. 그것에는 RuntimeHelpers.CleanupCode을 사용하여 델리게이트에 할당 된 private 메소드가 있습니다. 이것은 내가 예외적으로 실행된다는 것을 이해합니다.

이 두 가지 질문이 나타납니다 :

  1. 는 뮤텍스가 올바르게 구현을? 뮤텍스에 예외가 없으면 SafeWaitHandle은 절대로 처리되지 않습니다.
  2. 뮤텍스 정리를 위해 처분해야하는 것은 무엇입니까?

답변

5

Mutex명시 적으로 기본 클래스 WaitHandle을 통해IDisposable.Dispose을 구현합니다. 도메인 특정 이름이 폐기보다 적절한 이다 때때로

: 그것은 according to the guidelines을 폐기 패턴의 유효한 구현 (도 WaitHandle에서 상속) 공개 Close 방법을 통해 Dispose 기능을 공개한다. 예제의 경우 파일 캡슐화는 메서드 이름 Close를 사용하려고 할 수 있습니다. 이 경우 을 개인적으로 처리하고 이 Dispose를 호출하는 공용 닫기 메서드를 만듭니다. (...) 은 도메인에 맞는 메소드 이름 으로 닫기를 바꿀 수 있습니다.

System.IO의 여러 클래스도 이와 같이합니다.

+0

DOH : 나는 기어 설정과 이해를 한 것으로 본 순간 : 이 코드를 사용하여 해결. –

0

Close() 함수를 사용하면 VS 2013 Pro 업데이트 2에서 여전히 CA2000가 생성됩니다. 보호 수준으로 인해 Dispose() 함수에 연결할 수 없습니다.

그래서 실수가 있습니까? 아니면 VS의 코드 분석에 버그입니까?

편집

: 물론 그렇습니다,

Mutex MyApplicationMutex = null; 
try 
{ 
    MyApplicationMutex = new Mutex(true, Program.g_ApplicationMutexName); 
    if (MyApplicationMutex.WaitOne(0, false)) 
    { 
    ... 
    } 
} 
finally 
{ 
    // Dispose Mutex 
    if (MyApplicationMutex != null) 
    MyApplicationMutex.Close(); 
} 
관련 문제