CallContext.LogicalSetData 的线程安全使用

Thread safe usage of CallContext.LogicalSetData

我正在使用 CallContext.LogicalGetData 以便跨异步代码共享信息。

我想以 'thread-safe' 的方式执行这种调用:

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

知道怎么做吗?

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

注意:class 或方法不必是静态的。只要确保所有线程在访问临界区时使用相同的锁即可。