基于异步上下文的本地变量(AsyncLocal)【转】

AsyncLocal类似ThreadLocal。使用ThreadLocal的前提:
1、变量必须是多个线程共享的,如果是线程范围内的局部变量就不需要了。
2、希望每个线程都能读写独立的变量值。

AsyncLocal:
这个主要是用于保存异步等待上下文中的共享变量的值。从C# 5开始,引入了相当简便的异步等待语法,即await关键字调用异步方法,允许异步等待。
即代码在使用await关键字调用异步方法后,当前程序会等待异步方法返回后才会继续执行,但在这个等待过程中,不会阻塞当前线程,这比起编写委托来回调方便多了。

异步方法是基于Task的自动线程调度,在异步上下文的切换过程中,有可能会导致数据丢失。比如,在await调用前,对某个变量赋了值,而这个变量是多个线程共享的;当await调用返回后,有可能当前代码仍然处于先前的线程上,但也有可能被调度到其他线程上。这种情况一般发生在与应用程序UI线程无关的代码上,如果异步操作是由UI启动的,通常情况下不会调动异步上下文的线程,然而,如果异步操作是非UI触发的,典型的如在Main入口处启动的,这就很有可能出现异步上下文处于不同的线程上的情形。

参考:
https://www.cnblogs.com/tcjiaan/p/5007737.html
http://www.mamicode.com/info-detail-2911670.html(AsyncLocal实现原理)

原文地址:https://www.cnblogs.com/fanfan-90/p/13793294.html