2016-08-29 141 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

@大卫我不会那样做。读取变量也应该是线程安全的。 –