代码改变世界

HttpContextAccessor 之singleton

2021-12-16 17:24  qgbo  阅读(289)  评论(0)    收藏  举报

HttpContextAccessor 在.Net 系统中生命周期是singleton。

每一个请求来的时候不是应该New 一个 Context 吗?

它的源码中用到了这个:AsyncLocal<int>

每一个线程会保存它的本地的值。相当于线程的内部变量。

下面代码会打印:

100,100,100
300,300,100
100,100,100
300,300,100

 var _local = 0;
            AsyncLocal<int> _asyncLocal = new AsyncLocal<int>();
            ThreadLocal<int>   _threadLocal= new ThreadLocal<int>();
        Task.Run(() </span>=&gt;<span style="color: #000000;">
        {
            Thread.Sleep(</span><span style="color: #800080;">200</span><span style="color: #000000;">);
            </span><span style="color: #0000ff;">while</span> (<span style="color: #0000ff;">true</span><span style="color: #000000;">)
            {
                _asyncLocal.Value </span>= <span style="color: #800080;">100</span><span style="color: #000000;">;
                _threadLocal.Value </span>= <span style="color: #800080;">100</span><span style="color: #000000;">;
                _local </span>= <span style="color: #800080;">100</span><span style="color: #000000;">;
                Thread.Sleep(</span><span style="color: #800080;">2000</span><span style="color: #000000;">);
                Console.WriteLine(_asyncLocal.Value </span>+ $<span style="color: #800000;">"</span><span style="color: #800000;">   { _threadLocal.Value}  </span><span style="color: #800000;">"</span> +<span style="color: #000000;"> _local);
            }
        });

        Task.Run(() </span>=&gt;<span style="color: #000000;">
        {
            Thread.Sleep(</span><span style="color: #800080;">200</span><span style="color: #000000;">);
            _asyncLocal.Value </span>= <span style="color: #800080;">300</span><span style="color: #000000;">;
            _threadLocal .Value</span>= <span style="color: #800080;">300</span><span style="color: #000000;">;
            _local </span>= <span style="color: #800080;">300</span><span style="color: #000000;">;
            </span><span style="color: #0000ff;">while</span> (<span style="color: #0000ff;">true</span><span style="color: #000000;">)
            {
                Thread.Sleep(</span><span style="color: #800080;">2000</span><span style="color: #000000;">); 
                Console.WriteLine(_asyncLocal.Value </span>+ $<span style="color: #800000;">"</span><span style="color: #800000;">   { _threadLocal.Value}  </span><span style="color: #800000;">"</span> +<span style="color: #000000;"> _local);
            }
        });
        Console.ReadLine();</span></pre>