CallContext,ThreadStatic,AsyncLocal<T>,ThreadLocal<T>,学习笔记
1.CallContext
在当前调用上下文的线程数据槽里存储对象
2.ThreadStatic
是一个特性
3.AsyncLocal<T>
是一个类型,该字段应当为static,保证单例,在单例的模式下,在不同的线程上下文环境之中才可以保证线程内唯一,否则如果不是static的话,那么在每一次调用的时候都会产生一个引用,对应一个新的AsyncLocal<T>
4.ThreadLocal<T>
是一个类型,该字段应当为static
async声明的函数,都会开一个新的线程,
一旦一个函数声明为async,那么这就是一个新的线程,就算是还没有执行到await等待的代码,也已经开过了一个新的线程!
static class GuidFactory { private static AsyncLocal<string> _asyncLocalGuid = new AsyncLocal<string>(); public static string CurrentGuid { get { if (_asyncLocalGuid.Value == null) { _asyncLocalGuid.Value = Guid.NewGuid().ToString(); } return _asyncLocalGuid.Value; } } } class APP { private async void Fun1() { Console.WriteLine("外部:" + GuidFactory.CurrentGuid); Console.WriteLine("外部:" + GuidFactory.CurrentGuid); int num = await Task.Factory.StartNew<int>(() => { Console.WriteLine("内部:" + GuidFactory.CurrentGuid); Console.WriteLine("内部:" + GuidFactory.CurrentGuid); Thread.Sleep(4000); return 0; }); Console.WriteLine("外部:" + GuidFactory.CurrentGuid); Console.WriteLine("外部:" + GuidFactory.CurrentGuid); } private async void Fun2() { Console.WriteLine("外部:" + GuidFactory.CurrentGuid); Console.WriteLine("外部:" + GuidFactory.CurrentGuid); } public APP() { Fun1(); Fun1(); //Fun2(); //Fun2(); while (true) { Thread.Sleep(100); } } }