2016-08-29 101 views
1

我正在使用CallContext.LogicalGetData爲了跨異步代碼共享信息。線程安全使用CallContext.LogicalSetData

我想在一個「線程安全」的方式執行這種調用:

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

如何做到這一點任何想法?

回答

1

使用lock

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; 
    } 
} 

注意:類或方法不必是靜態的。只要確保所有線程在訪問關鍵部分時使用相同的鎖定。

+0

你說得對,我不需要每個上下文鎖,一個鎖就夠了=)謝謝! – David

+0

由於性能原因,我認爲在空檢查後放置鎖定甚至會更好。 – David

+0

@大衛我不會那樣做。讀取變量也應該是線程安全的。 –