2012-11-27 2 views
1

코드는 다음과 같습니다 : 나는 Interlocked.Increment, 오른쪽 스레드 안전 문제를 처리 할 생각참조로 값 유형 변수를 정적 메서드 스레드 안전으로 전달합니까?

private static int _exceptionCount; 

JobManager.TrackExceptionCount(ref _exceptionCount); 

:

public class JobManager 
{ 
    public static void TrackExceptionCount(ref int exceptionCount) 
    { 
     Interlocked.Increment(ref exceptionCount); 
    } 

    //other helper methods 
} 

내가 좋아하는 다른 장소에서이 메소드를 호출 할 것인가?

편집 :

내가 여러 작업 클래스 다음과 같이 있습니다

class JobA 
{ 
    private static int _exceptionCount; 

    public void method1() 
    { 
     Task.Factory.Start(()=>{ 
     try 
     { 
      //Some code 
     } 
     catch(exception ex) 
     { 
      JobManager.TrackExceptionCount(ref _exceptionCount); 
     } 
     }); 
    } 

    public void method2() 
    { 
     Task.Factory.Start(()=>{ 
     try 
     { 
      //Some code 
     } 
     catch(exception ex) 
     { 
      JobManager.TrackExceptionCount(ref _exceptionCount); 
     } 
     }); 
    } 
} 

class JobB 
{ 
    private static int _exceptionCount; 

    public void method1() 
    { 
     Task.Factory.Start(()=>{ 
     try 
     { 
      //Some code 
     } 
     catch(exception ex) 
     { 
      JobManager.TrackExceptionCount(ref _exceptionCount); 
     } 
     }); 
    } 

    public void method2() 
    { 
     Task.Factory.Start(()=>{ 
     try 
     { 
      //Some code 
     } 
     catch(exception ex) 
     { 
      JobManager.TrackExceptionCount(ref _exceptionCount); 
     } 
     }); 
    } 
} 

내가 믿는 아마도 catch 블록 더 좋은 방법이 직접 전화 Interlocked.Increment. 여전히

하지만은 (_exceptionCount REF)를 JobManager.TrackExceptionCount이

감사 아마 작동 여부 될 경우 알고 싶어요.

+0

아니요 * static * 키워드는 하루 종일 유실됩니다. 인터록 (interlocked)이 효과가있을 수도 있지만 코드 스 니펫 (snippet)은 다른 곳에서 사용되는 것을보기에는 완전히 부적절합니다. –

+0

이 작업을 수행하는 것이 스레드로부터 안전하지 않다는 증거가 있습니까? 어떤 오류가 있었습니까? 아니면 당신의 의혹을 확인하거나 부정하려는 것입니까? – Enigmativity

+0

안녕하세요. Enigmativity 님, 방금 이와 비슷한 사례를 만났습니다.이 의혹을 확인하거나 거부하고 싶습니다. –

답변

0

Interlocked.Increment으로 전화하는 것이 저장 위치 _exceptionCount의 유일한 사용이라고 가정하면 안전합니다. 안전하게 주위에 ref 매개 변수를 전달할 수 있습니다. 변수에 대한 관리 된 포인터처럼 약간 작동합니다 (내부적으로도 마찬가지입니다).

+0

감사합니다 usr, _exceptionCount는 연동에 전달하는 데에만 사용됩니다 –