2016-08-29 8 views
1

비동기 코드에서 정보를 공유하기 위해 CallContext.LogicalGetData를 사용하고 있습니다.CallContext.LogicalSetData 스레드를 안전하게 사용합니다.

나는 '스레드 안전'방식으로 호출의 종류를 수행 할 :

var val = CallContext.LogicalGetData(key); 
if(val==null) 
{ 
    CallContext.LogicalSetData(key, initialValue); 
} 
return val; 

그 작업을 수행하는 방법에 대한 어떤 생각을?

private static readonly object _lock = new object(); 

public static object GetData(string key, object initialValue) 
{ 
    lock(_lock) 
    { 
     object val = CallContext.LogicalGetData(key); 
     if (val == null) 
      CallContext.LogicalSetData(key, initialValue); 
     return val; 
    } 
} 

참고 :

답변

1

lock를 사용하여 클래스 나 메소드는 정적 일 필요가 없습니다. 중요한 섹션에 액세스 할 때 모든 스레드가 동일한 잠금을 사용하는지 확인하십시오.

+0

네가 맞아 문맥마다 자물쇠가 필요 없어 하나의 자물쇠 만 있으면 충분해 =) 고마워! – David

+0

성능상의 이유로 Null 검사 후에 잠금을 설정하는 것이 더 좋을 것이라고 생각합니다. – David

+0

@ David 나는 그렇게하지 않을 것이다. 변수 읽기는 스레드로부터도 안전해야합니다. –