线程的本地存储-数据槽、ThreadStatic、ThreadLocal、CallContext

实现线程的本地存储,也就是线程内可见。这些数据都是存放在线程环境块中,是线程的空间开销

有以下几种方式:

线程数据槽:(已过时,建议使用ThreadStaticAttribute)

static void Main(string[] args)
{
var slot = Thread.AllocateDataSlot();//给所有线程分配一个数据槽,存放数据。。。

Thread.SetData(slot, "helloworld");//当前线程设置数据,只有当前线程可读数据

Console.WriteLine(Thread.GetData(slot));//helloworld

var t1 = new Thread(() => {
Console.WriteLine("t1:"+Thread.GetData(slot));//无数据
});

t1.Start();
Console.ReadKey();
}

 

ThreadStaticAttribute:比数据槽性能好,使用方便

[ThreadStatic]
static string username = string.Empty;

 

ThreadLocal: 也是用来做 线程可见性,它是强类型的

static void Main(string[] args)
{
ThreadLocal<string> local = new ThreadLocal<string>();
local.Value = "hello world!!!";
var t = new Thread(() =>
{
Console.WriteLine("当前工作线程:{0}", local.Value);
});
t.Start();
Console.WriteLine("主线程:{0}", local.Value);
Console.Read();
}

 

CallContext 线程内可见。当 CallContext 沿执行代码路径往返传播并且由该路径中的各个对象检查时,可将对象添加到其中。
使用场景:当对象需要线程内全局使用。Core不支持

CallContext.SetData(key, temp);
DbContext temp = CallContext.GetData(key) as DbContext;

 

你可能感兴趣的:(线程的本地存储-数据槽、ThreadStatic、ThreadLocal、CallContext)