코드는 다음과 같습니다 : 나는 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이
감사 아마 작동 여부 될 경우 알고 싶어요.
아니요 * static * 키워드는 하루 종일 유실됩니다. 인터록 (interlocked)이 효과가있을 수도 있지만 코드 스 니펫 (snippet)은 다른 곳에서 사용되는 것을보기에는 완전히 부적절합니다. –
이 작업을 수행하는 것이 스레드로부터 안전하지 않다는 증거가 있습니까? 어떤 오류가 있었습니까? 아니면 당신의 의혹을 확인하거나 부정하려는 것입니까? – Enigmativity
안녕하세요. Enigmativity 님, 방금 이와 비슷한 사례를 만났습니다.이 의혹을 확인하거나 거부하고 싶습니다. –