AsyncLocal的妙用
AsyncLocal<T>是一个在.NET中用来在同步任务和异步任务中保持全局变量的工具类。
它允许你在不同线程的同一个对象中保留一个特定值,这样你可以在不同的函数和任务中访问这个值。
这是在实现异步任务中维持一致性和优雅性的一种重要手段。
用法
创建一个AsyncLocal实例:
你可以使用AsyncLocal<T>来创建一个特定类型的实例,比如:
AsyncLocal<string> asyncLocalString = new AsyncLocal<string>();
设置值:
你可以通过Value属性设置或者读取值:
asyncLocalString.Value = "Hello, AsyncLocal!";
读取值:
在任务中的任意位置,你都可以读取这个值:
Console.WriteLine(asyncLocalString.Value);
实例分享与给值变更:
在不同任务和串行任务中,AsyncLocal 实例的值是不一样的:
asyncLocalString.Value = "Main Task";
Task.Run(() =>
{
asyncLocalString.Value = "Child Task";
Console.WriteLine(asyncLocalString.Value); // 输出 "Child Task"
});
Console.WriteLine(asyncLocalString.Value); // 输出 "Main Task"
值变更时的事件触发:
AsyncLocal 充分利用于在值变化时触发特定事件。你可以通过添加处理函数来监听值的变更:
asyncLocalString.ValueChanged += (sender, e) =>
{
Console.WriteLine($"Old Value: {e.PreviousValue}, New Value: {e.CurrentValue}");
};
asyncLocalString.Value = "New Value";
场景
数据传递:
异步任务中,通过AsyncLocal进行全局数据传递而无需通过参数传递。这对于学习和复用代码很有帮助。
上下文管理:
在ASP.NET Core中,AsyncLocal 可用于管理用户请求上下文,实现不同请求之间的传递。当你需要保存一些请求相关的信息时,这是一种很有效的方法。
百分比信息保存:
记录不同任务和串行任务中的特定信息,说明这些任务是如何分布的。这在分析和跟踪异步操作时应对特别有用。
系统日志和跟踪:
AsyncLocal 可用于在异步任务中保存和分享日志和跟踪信息,以便在运行时采集最有益的信息,有助于问题跟踪和分析。
示例:保存日志和租户信息
以下是一个使用AsyncLocal保存日志和租户信息的示例:
using System;
using System.Threading;
using System.Threading.Tasks;
public class LogContext
{
public string StackTrace { get; set; }
public string UserInfo { get; set; }
}
public class TenantContext
{
public string Name { get; set; }
}
public class Program
{
private static AsyncLocal<LogContext> _logContext = new AsyncLocal<LogContext>();
private static AsyncLocal<TenantContext> _tenantContext = new AsyncLocal<TenantContext>();
public static async Task Main(string[] args)
{
_logContext.Value = new LogContext { StackTrace = "Main Stack Trace", UserInfo = "User1" };
_tenantContext.Value = new TenantContext { Name = "Tenant A" };
Console.WriteLine($"Initial Log Context: {_logContext.Value.StackTrace}, User: {_logContext.Value.UserInfo}, Tenant: {_tenantContext.Value.Name}");
await Task.Run(() => LogAndProcess(new LogContext { StackTrace = "Child Stack Trace", UserInfo = "User2" }, new TenantContext { Name = "Tenant B" }));
Console.WriteLine($"After Task Log Context: {_logContext.Value.StackTrace}, User: {_logContext.Value.UserInfo}, Tenant: {_tenantContext.Value.Name}");
}
private static void LogAndProcess(LogContext logContext, TenantContext tenant)
{
_logContext.Value = logContext;
_tenantContext.Value = tenant;
Console.WriteLine($"In Task Log Context: {_logContext.Value.StackTrace}, User: {_logContext.Value.UserInfo}, Tenant: {_tenantContext.Value.Name}");
// Simulate some processing
Task.Delay(1000).Wait();
Console.WriteLine($"After Processing Log Context: {_logContext.Value.StackTrace}, User: {_logContext.Value.UserInfo}, Tenant: {_tenantContext.Value.Name}");
}
}
在这个示例中,AsyncLocal 用于保存日志和租户信息,确保在不同的任务上下文中正确传递和使用这些信息。
AsyncLocal的妙用的更多相关文章
- 【CSS进阶】伪元素的妙用--单标签之美
最近在研读 <CSS SECRET>(CSS揭秘)这本大作,对 CSS 有了更深层次的理解,折腾了下面这个项目: CSS3奇思妙想 -- Demo (请用 Chrome 浏览器打开,非常值 ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- JavaScript的妙与乐(一)之 函数优化
JavaScript的妙与乐系列文章主要是展示一些JavaScript上面比较好玩一点的特性和一些有用的技巧,里面很多内容都是我曾经在项目中使用过的一些内容(当然,未必所有技巧的使用频率都很高^_^) ...
- Promise的前世今生和妙用技巧
浏览器事件模型和回调机制 JavaScript作为单线程运行于浏览器之中,这是每本JavaScript教科书中都会被提到的.同时出于对UI线程操作的安全性考虑,JavaScript和UI线程也处于同一 ...
- 【.NET深呼吸】基于异步上下文的本地变量(AsyncLocal)
在开始吹牛之前,老周说两个故事. 第一个故事是关于最近某些别有用心的人攻击.net的事,其实我们不用管它们,只要咱们知道自己是.net爱好者就行了,咱们就是因为热爱.net才会选择它.这些人在这段时间 ...
- 【CSS进阶】伪元素的妙用2 - 多列均匀布局及title属性效果
最近无论是工作还是自我学习提升都很忙,面对长篇大论的博文总是心有余而力不足,但又不断的接触学习到零碎的但是很有意义的知识点,很想分享给大家,所以本篇可能会很短. 本篇接我另一篇讲述 CSS 伪元素的文 ...
- 不太被人提起的%%lockres%%的妙用
%%lockres%% 这个值似乎很少被大家提到,甚至微软在官方文档中. 它返回是一个Hash Value,看乎这个值没什么用. 后来在实践也有它的妙用之处,比如在出现性能问题如LOCK时,一般先通过 ...
- 【优雅代码】深入浅出 妙用Javascript中apply、call、bind
这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: “对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂的知识.我 ...
- 【javascript 技巧】Array.prototype.slice的妙用
Array.prototype.slice的妙用 开门见山,关于Array 的slice的用法可以参考这里 http://www.w3school.com.cn/js/jsref_slice_arra ...
- EF6 Power Tools的妙用和问题
环境:vs2013+EF:6.1.3.0+Power Tools:Beta 4 power tools:是一个反向工程,在已有数据库的情况下,可以利用它生成Code Frist模式的代码. 问题: 它 ...
随机推荐
- VMware安装Ubuntu操作系统 2024.9.27
1.安装 Ubuntu的官方网站是:https://www.ubuntu.com/download 点进去可以直接下载 文件下载会比较慢,我这点用了约5分钟 然后就可以打开vmware,选择: 就可以 ...
- .NET开发者福音:JetBrains官方宣布 Rider 非商用免费开放!
前言 JetBrains官方前段时间宣布重磅消息,其两款知名IDE应用WebStorm和Rider现已面向社区开放,允许用户免费用于非商业用途.此举旨在支持学习.开源项目开发.内容创作及业余开发等活动 ...
- register at least one qt version using“qt vs tools“->“qt options“问题描述及解决方法
问题描述:在安装了Qt 5.9.8,vs 2022, QT VS Tool 2022并配置好环境变量之后创建Qt项目时无法创建,提示至少需要注册一个Qt版本到Qt VS Tools的Qt Option ...
- 卢卡斯定理/Lucas 定理
卢卡斯定理/Lucas 定理 引入 求 \(C_{n+m}^n \mod p\). \(n,m,p \leq 10^5\). 如果直接用阶乘求,可能在阶乘过程中出现了 \(p\),而最后的结果没有出现 ...
- java4~6次大作业全面总结
一:前言: 知识点总结: 面向对象设计: 智能家居强电电路模拟系统:设计了多种控制设备(开关.分档调速器.连续调速器)和受控设备(灯.风扇)的类,并通过继承和多态实现设备的特有行为. 答题判题程序:设 ...
- 一文详解:项目如何从Docker慢慢演变成了K8s部署
今天,我们将深入探讨一个项目部署的演变过程.在这篇文章中,为了紧扣主题,我们将从 Docker 开始讲解,分析为什么一个传统的项目逐步演变成了今天流行的 Kubernetes(K8s)集群部署架构.我 ...
- golang之常用开发工具
汇总平常开发中较为常用的工具 [sql2struct] 将MySQL快速生成struct github: https://github.com/idoubi/sql2struct
- 网站安全锁-SSL证书
为了安全起见,现在开发微信服务号和IOS客户端等访问服务器端都要求使用https加密传输. SSL证书是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.因为配置在服务器上,也称为SSL服务器证 ...
- 使用PicGo存储markdown图片(阿里云或者github)
PicGo代替极简图床 之前使用极简床图,但是后来好像挂了,真是一件悲伤的事,最近才发现了一个神器,开源的PicGo,已经有各个平台的版本了.链接如下:https://github.com/Molun ...
- 论文泛读《PICCOLO : Exposing Complex Backdoors in NLP Transformer Models》
发表时间:2022 期刊会议:IEEE Symposium on Security and Privacy (SP) 论文单位:Purdue University 论文作者:Yingqi Liu, G ...