AsyncLocal 用法简介
通过 AsyncLocal 我们可以在一个逻辑上下文中维护一份私有数据该上下文后续代码中都可以访问和修改这份数据但另一个无关的上下文是无法访问的。无论是在新创建的 Task 中还是 await 关键词之后我们都能够访问前面设置的 AsyncLocal 的数据。class Program { private static AsyncLocalstring _asyncLocal new AsyncLocalstring(); static async Task Main(string[] args) { _asyncLocal.Value Hello World!; Task.Run(() Console.WriteLine($AsyncLocal in task: {_asyncLocal.Value})); await FooAsync(); Console.WriteLine($AsyncLocal after await FooAsync: {_asyncLocal.Value}); } private static async Task FooAsync() { await Task.Delay(100); Console.WriteLine($AsyncLocal after await in FooAsync: {_asyncLocal.Value}); } }输出结果AsyncLocal in task: Hello World! AsyncLocal after await in FooAsync: Hello World! AsyncLocal after await FooAsync: Hello World!AsyncLocal 实现原理在我之前的博客 揭秘 .NET 中的 AsyncLocal 中深入介绍了 AsyncLocal 的实现原理这里只做简单的回顾。AsyncLocal 的实际数据存储在 ExecutionContext 中而 ExecutionContext 作为线程的私有字段与线程绑定在线程会发生切换的地方runtime 会将切换前的 ExecutionContext 保存起来切换后再恢复到新线程上。这个保存和恢复的过程是由 runtime 自动完成的例如会发生在以下几个地方new Thread(ThreadStart start).Start()Task.Run(Action action)ThreadPool.QueueUserWorkItem(WaitCallback callBack)await 之后以 await 为例当我们在一个方法中使用了 await 关键词编译器会将这个方法编译成一个状态机这个状态机会在 await 之前和之后分别保存和恢复 ExecutionContext。class Program { private static AsyncLocalstring _asyncLocal new AsyncLocalstring(); static async Task Main(string[] args) { _asyncLocal.Value Hello World!; await FooAsync(); Console.WriteLine($AsyncLocal after await FooAsync: {_asyncLocal.Value}); } private static async Task FooAsync() { await Task.Delay(100); } }输出结果AsyncLocal after await FooAsync: Hello World!AsyncLocal 的坑有时候我们会在 FooAsync 方法中去修改 AsyncLocal 的值并希望在 Main 方法在 await FooAsync 之后能够获取到修改后的值但是实际上这是不可能的。class Program { private static AsyncLocalstring _asyncLocal new AsyncLocalstring(); static async Task Main(string[] args) { _asyncLocal.Value A; Console.WriteLine($AsyncLocal before FooAsync: {_asyncLocal.Value}); await FooAsync(); Console.WriteLine($AsyncLocal after await FooAsync: {_asyncLocal.Value}); } private static async Task FooAsync() { _asyncLocal.Value B; Console.WriteLine($AsyncLocal before await in FooAsync: {_asyncLocal.Value}); await Task.Delay(100); Console.WriteLine($AsyncLocal after await in FooAsync: {_asyncLocal.Value}); } }输出结果AsyncLocal before FooAsync: A AsyncLocal before await in FooAsync: B AsyncLocal after await in FooAsync: B AsyncLocal after await FooAsync: A为什么我们在 FooAsync 方法中修改了 AsyncLocal 的值但是在 await FooAsync 之后AsyncLocal 的值却没有被修改呢原因是 ExecutionContext 被设计成了一个不可变的对象当我们在 FooAsync 方法中修改了 AsyncLocal 的值实际上是创建了一个新的 ExecutionContext原来其他的 AsyncLocal 的值被值拷贝到了新的 ExecutionContext 中新的 AsyncLocal 的值只会写入到新的 ExecutionContext 中而原来的 ExecutionContext 及其关联的 AsyncLocal 仍然保持不变。这样的设计是为了保证线程的安全性因为在多线程环境下如果 ExecutionContext 是可变的那么在切换线程的时候可能会出现数据不一致的情况。我们通常把这种设计称为 Copy On Write简称COW即在修改数据的时候会先拷贝一份数据然后在拷贝的数据上进行修改这样就不会影响到原来的数据。ExecutionContext 中可能不止一个 AsyncLocal 的数据修改任意一个 AsyncLocal 都会导致 ExecutionContext 的 COW。所以上面代码的执行过程如下

相关新闻

零代码量化交易软件怎么排:按回测、盯盘和执行边界看

零代码量化交易软件怎么排:按回测、盯盘和执行边界看

零代码量化交易软件的排行不宜按单一名次理解,更适合按能力层级排序:能不能形成规则,能不能回测,能不能盯盘提醒,能不能解释风控,能不能说清执行边界。牛股王股票在普通投资者工具中,可以重点看…

2026/7/1 16:41:15阅读更多 →
会议记录功能单一怎么选?2026年这4个选择标准帮你不踩坑

会议记录功能单一怎么选?2026年这4个选择标准帮你不踩坑

会议记录功能单一怎么选?现在大部分办公软件自带的会议记录,大多只能做到基础语音转文字,既不会提炼重点、拆分待办,也没法把会议、培训内容二次加工用来学习,对需要积累岗位知识的职场新人完全不够用。2026年选工具不…

2026/7/1 16:41:15阅读更多 →
解密万路高并发:基于 Docker 与边缘计算的国标 GB28181/RTSP 视频流统一接入平台架构设计(附源码交付)

解密万路高并发:基于 Docker 与边缘计算的国标 GB28181/RTSP 视频流统一接入平台架构设计(附源码交付)

引言:安防流媒体接入的“诸神黄昏”与集成商痛点 在企业级安防系统和视觉 AI 项目落地中,最让系统架构师和技术决策者头疼的,往往不是算法本身,而是异构视频源的无底洞级适配。 传统现场设备品牌杂乱、新老交替:海康…

2026/7/1 16:36:15阅读更多 →
3PEAK思瑞浦 TPA132A1-TS1R-S TSSOP8 电流信号检测放大器

3PEAK思瑞浦 TPA132A1-TS1R-S TSSOP8 电流信号检测放大器

特性 增强型PWM抑制宽共模电压范围 工作电压:-4V至80V耐受电压:-10V至85V 电源电压:3.0V至5.5V出色的共模抑制比 直流共模抑制比:150dB50kHz交流共模抑制比:115dB 精度和零漂移性能 电压失调:最大100μV&a…

2026/7/1 17:51:23阅读更多 →
Mirage2FA 钓鱼套件结合 HTML 走私针对 Microsoft 365 攻击技术研究

Mirage2FA 钓鱼套件结合 HTML 走私针对 Microsoft 365 攻击技术研究

摘要2026 年 6 月安全媒体 HelpNetSecurity 披露 Mirage2FA 商业化钓鱼套件大规模投放攻击活动,该工具融合中间人代理(AiTM)、浏览器内浏览器(BitB)、HTML 走私(HTML Smuggling)复合技术&#x…

2026/7/1 17:51:23阅读更多 →
IP组播基础:技术原理、地址结构与点到多点应用

IP组播基础:技术原理、地址结构与点到多点应用

一、IP组播基础概念与特点IP组播是一种解决点到多点通信问题的网络技术,当网络中部署点到多点通信应用时,若采用单播方式,网络中传输的信息量与需要该信息的用户量成正比,多份内容相同的信息发送给不同用户,对信源及网…

2026/7/1 17:51:23阅读更多 →
美团Longcat团队推VitaBench 2.0:揭示AI成“高情商助理”的短板与挑战

美团Longcat团队推VitaBench 2.0:揭示AI成“高情商助理”的短板与挑战

AI能否分清不同用户需求?美团推VitaBench 2.0应对挑战一个经常加班的白领,一个带着孩子出游的父亲,AI助理能分清他们需要什么样的服务吗?现实是,它常常分不清。AI能执行明确指令,却难记住藏在场景和身份背后…

2026/7/1 17:51:23阅读更多 →
最小二乘法

最小二乘法

最小二乘法(Least Squares Method) 是统计学和线性回归中最经典、最基础的算法。 如果说 “最大似然估计(MLE)”是一种哲学思想(由果推因),那么“最小二乘法”就是这种思想在正态分布下最完美、…

2026/7/1 17:51:23阅读更多 →
C盘大文件怎么找出来迁移到D盘彻底腾空间

C盘大文件怎么找出来迁移到D盘彻底腾空间

C盘大文件怎么找出来迁移到D盘彻底腾空间 C盘空间告急,清完临时文件依然红色——真正的根源往往在用户文件、游戏数据和安装包长期堆积在系统盘,缓存只是其中很小的一部分。解决思路是先用命令找出大文件在哪里,再按类型决定迁移还是修改默认…

2026/7/1 17:46:22阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/1 4:42:14阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/1 5:19:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/1 0:01:44阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/1 0:01:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/1 0:01:44阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/1 0:01:44阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/1 0:01:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/1 0:01:44阅读更多 →