httpcontext.current.xxxxxx
这是一个静态的对象,每次去访问的时候都会是当前的所需要的东西
当我们自己自定义上下文信息的时候,就需要自己造一个类似的上下文存储
public static class CallContext
{
static AsyncLocal<ConcurrentDictionary<string, object>> state = new AsyncLocal<ConcurrentDictionary<string, object>>();
public static void SetData(string name, object data)
{
state.Value.AddOrUpdate(name, data,(a,b)=>data);
}
public static object GetData(string name)
{
return state.Value.TryGetValue(name, out object data) ? data : null;
}
internal static bool DeleteData(string name)
{
return state.Value.TryRemove(name, out object data);
}
internal static IEnumerable<string> GetDictionaryKeys()
{
return state.Value.Keys;
}
}
当多线程同时访问state的同一个key值时,会得到当前线程赋予的对应对象
比如多线程用的是如下调用
CallContext.SetData("BUAA",DateTime.Now);
那么在对应线程里去获取
var data =CallContext.GetData("BUAA")
获取到的时间是不同的,这是由于AsyncLocal 进行上下文关联造成的,在当前状态下不会由于外界的变化而变化