代码改变世界

HttpContextAccessor 之singleton

2021-12-16 17:24  qgbo  阅读(308)  评论(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(() =>
{
Thread.Sleep(
200);
while (true)
{
_asyncLocal.Value
= 100;
_threadLocal.Value
= 100;
_local
= 100;
Thread.Sleep(
2000);
Console.WriteLine(_asyncLocal.Value
+ $" { _threadLocal.Value} " + _local);
}
});

Task.Run(() =>
{
Thread.Sleep(
200);
_asyncLocal.Value
= 300;
_threadLocal .Value
= 300;
_local
= 300;
while (true)
{
Thread.Sleep(
2000);
Console.WriteLine(_asyncLocal.Value
+ $" { _threadLocal.Value} " + _local);
}
});
Console.ReadLine();