zoukankan      html  css  js  c++  java
  • 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);
                }
            }
        }

  • 相关阅读:
    pexpect库学习之包装类详解
    spawn类expect方法详解
    spawn类参数command详解
    Django中如何实现数据库路由?
    Memcached中的存取命令详解
    Javascript的参数详解
    Python中Paramiko协程方式详解
    Greenlets间如何实现互相通信?
    Gevent中的同步与异步详解
    jQuery正则的使用方法步骤详解
  • 原文地址:https://www.cnblogs.com/jimaojin/p/7462358.html
Copyright © 2011-2022 走看看