SF
唐青枫
唐青枫
注册登录
关注博客
注册登录
主页
关于
RSS
C#.NET Consul + Steeltoe 深入解析:服务注册发现、健康检查与微服务接入
唐青枫
3 月 31 日
阅读 10 分钟
518
简介在 .NET 微服务里,只要你开始拆服务,很快就会遇到这几个现实问题:服务实例越来越多,地址不固定调用方不能再把 IP:Port 写死某个实例挂了,调用方最好别继续打过去配置、注册、发现、负载均衡这些事,不能全靠手写这时候经常会一起出现两个名字: {代码...} 一句话先说透:Consul 是服务注册发现和健康检查的基础...
C#.NET ConcurrentQueue<T> 深入解析:无锁队列原理、FIFO 语义与使用边界
唐青枫
3 月 31 日
阅读 7 分钟
555
简介在 .NET 里做并发集合选型时,只要需求里出现这几个关键词:生产者-消费者任务排队消息缓冲先来先处理很多时候你真正要找的,其实不是 ConcurrentStack<T>,也不是 ConcurrentBag<T>,而是: {代码...} 它位于: {代码...} 一句话先说透:ConcurrentQueue<T> 是 .NET 提供的线程安全 FIFO 队列,...
C#.NET ConcurrentStack<T> 深入解析:无锁栈原理、LIFO 语义与使用边界
唐青枫
3 月 27 日
阅读 6 分钟
559
简介在 .NET 里做并发集合选型时,很多人最先想到的是:ConcurrentDictionary<TKey, TValue>ConcurrentQueue<T>ConcurrentBag<T>但如果你的数据结构天然是“栈”,也就是: {代码...} 那真正对应的并发集合其实是: {代码...} 它位于: {代码...} 一句话先说透:ConcurrentStack<T> 是 .NET 提供...
C#.NET ReaderWriterLockSlim 深入解析:读写锁原理、升级锁与使用边界
唐青枫
3 月 26 日
阅读 7 分钟
587
简介在 .NET 里做并发控制时,最常见的默认答案通常还是: {代码...} 这没有问题。但有一类场景,普通互斥锁会显得有点“太保守”:读很多写很少读操作彼此其实并不冲突比如:本地缓存查询配置快照读取内存索引查找大量读、少量写的共享字典这时候如果所有读操作也都互相排队,吞吐量往往会被白白压住。ReaderWriterLockSl...
C#.NET System.Threading.Lock 深入解析:新一代 lock、底层语义与使用边界
唐青枫
3 月 25 日
阅读 7 分钟
664
简介在 .NET 里提到线程同步,很多人的第一反应还是: {代码...} 这套写法本身没有问题,而且已经用了很多年。但从 .NET 9 和 C# 13 开始,官方开始明确给出一个更推荐的方向: {代码...} 也就是说,互斥锁这件事,不再只是“拿个 object 凑合锁一下”,而是开始有了一个专用类型。这篇文章重点讲清楚几件事:System.Threa...
C#.NET SpinLock 深入解析:自旋锁原理、使用边界与性能取舍
唐青枫
3 月 24 日
阅读 6 分钟
621
简介在 .NET 里,只要你开始深入看并发控制,很快就会发现这样一个现象:大多数业务代码都用 lock异步场景更常见的是 SemaphoreSlim / AsyncLock简单状态更新则更适合 Interlocked但在更底层的高性能并发场景里,你还会遇到一个更“危险”的家伙: {代码...} 一句话先说透:SpinLock 是一种忙等待锁。抢不到锁时,线程不会...
C#.NET SignalR + Redis Backplane 深入解析:多节点部署与跨实例消息同步
唐青枫
3 月 23 日
阅读 9 分钟
666
简介SignalR 在单节点开发环境里通常很好用。你本地起一个应用,前端连上来,消息一发,聊天室、通知、在线状态、协作编辑似乎都没什么问题。但很多团队一到生产环境,问题就开始冒出来了:应用一扩成两个实例,广播突然不全了;Clients.All 看起来发了,但总有人收不到;某些用户连在节点 A,消息却从节点 B 发出;组消...
深入理解 C#.NET TaskScheduler:为什么大量使用 Work-Stealing
唐青枫
3 月 20 日
阅读 7 分钟
599
简介只要你开始深入看 .NET 的并行调度模型,很快就会碰到一个高频词: {代码...} 很多文章会告诉你:它是“工作窃取”每个线程有自己的队列队列空了就去偷别人的任务这些说法当然没错,但还远远不够。真正值得搞懂的问题其实是:.NET 默认调度体系为什么这么依赖 Work-Stealing,而不是简单用一个全局队列把所有任务排起...
深入理解 C#.NET Task.Run:调度原理、线程池机制与性能优化
唐青枫
3 月 19 日
阅读 6 分钟
1.3k
简介Task.Run 是 .NET 里最常见、也最容易被误解的 API 之一。很多人对它的第一印象是:“开个后台线程”“把同步代码变异步”“防止阻塞当前线程”这些说法不能说全错,但都不够准确。一句话先说透:Task.Run 的本质,是把一个委托包装成 Task,然后交给 TaskScheduler.Default 调度,而默认调度器背后通常就是线程池。所以它...
C#.NET stackalloc 深入解析:栈上分配、Span 配合与使用边界
唐青枫
3 月 18 日
阅读 8 分钟
628
简介在 .NET 里,只要你开始关注性能,尤其是这些场景:高频字符串处理;协议解析和编码;临时 byte / char 缓冲区;循环里的小数组分配;希望减少 GC 干扰的热点代码;你大概率会遇到: {代码...} 一句话先说透:stackalloc 的作用,是在当前方法的栈帧里分配一段连续内存,通常配合 Span<T> 使用,用来替代短生...
C#.NET Pipelines 深入解析:高性能 IO 管道与零拷贝协议处理实战
唐青枫
3 月 17 日
阅读 7 分钟
1.3k
简介如果说:Span<T> 解决的是“如何高效操作一段连续内存”;Memory<T> 解决的是“如何跨异步边界持有连续内存”;ReadOnlySequence<T> 解决的是“如何处理多段逻辑连续内存”;那么 System.IO.Pipelines 解决的就是更完整的一层问题:如何把“数据读取、缓冲区管理、分段处理、背压控制、协议解析”整合成一...
C#.NET ReadOnlySequence 深入解析:多段内存遍历与零拷贝协议解析
唐青枫
3 月 16 日
阅读 6 分钟
1.3k
如果说 Span<T> 解决的是“如何高效处理一段连续内存”,Memory<T> 解决的是“如何跨异步边界持有一段连续内存”,那么 ReadOnlySequence<T> 解决的就是另一个更真实的问题:
C#.NET Memory 深入解析:跨异步边界的内存视图与高性能实战
唐青枫
3 月 14 日
阅读 7 分钟
1.3k
简介如果说 Span<T> 是 .NET 高性能内存体系里最亮眼的类型,那么 Memory<T> 就是它最重要的搭档。很多人学完 Span<T> 后,马上会遇到几个现实问题:为什么 Span<T> 不能做类字段?为什么 Span<T> 不能跨 await?为什么异步 IO 场景里,很多 API 更喜欢 Memory<T> / ReadOnlyMemory...
C#.NET Span 深入解析:零拷贝内存切片与高性能实战
唐青枫
3 月 13 日
阅读 7 分钟
1.2k
简介在 .NET 里,只要你开始关注性能,尤其是这些场景:字符串解析;网络协议处理;文件读取和缓冲区操作;JSON、CSV、日志、报文解析;高频数组切片;你几乎一定会遇到 Span<T>。它之所以重要,不是因为它“新”,而是因为它解决的是一个非常实际的问题:如何在不额外分配内存、不额外复制数据的前提下,高效地操作...
C#.NET 源生成器 深入解析:编译时代码生成与增量生成器实战
唐青枫
3 月 12 日
阅读 14 分钟
788
简介在 .NET 项目里,很多“重复但又不能随便写错”的代码,本质上都不值得手写。例如:DTO 映射代码;INotifyPropertyChanged 模板代码;接口注册代码;序列化上下文;特性驱动的样板方法;各种“按规则扫描代码再生成辅助类”的场景。过去这类问题通常有 3 种解法:手写,最直接,但重复劳动多;运行时反射,灵活,但有开...
C#.NET Expression Tree 深入解析:表达式树、动态查询与运行时代码生成
唐青枫
3 月 11 日
阅读 13 分钟
1.1k
简介在 C#.NET 里,很多人第一次接触表达式树,通常是因为 LINQ、Entity Framework,或者某段代码里突然冒出了这样一行: {代码...} 表面上看,它和普通 Lambda 很像,但本质完全不同。Func<User, bool> 表示“可执行代码”;Expression<Func<User, bool>> 表示“可分析、可遍历、可改写的代码结构”。这...
C#.NET SignalR 深入解析:实时通信、Hub 与连接管理实战
唐青枫
3 月 10 日
阅读 20 分钟
967
简介在传统 HTTP 请求模型里,客户端发请求,服务端给响应,请求结束后连接关系基本也就结束了。这套模型处理普通 CRUD 没问题,但一到下面这些场景就开始别扭:聊天室、站内通知、在线客服;实时仪表盘、订单状态刷新、监控大屏;协同编辑、在线白板、多人房间;后端事件触发后,需要主动推送给客户端。这类需求的核心...
C#.NET Channel 深入解析:高性能异步生产者消费者模型实战
唐青枫
3 月 9 日
阅读 8 分钟
1.1k
简介在 C#.NET 里,只要碰到“生产者不断产出数据,消费者持续处理数据”这类场景,最终都会绕到一个核心问题:如何解耦生产速度和消费速度;如何在高并发下保证吞吐量;如何在异步场景下避免把线程白白阻塞住;如何在队列堆积时做背压、限流或丢弃。System.Threading.Channels 提供的 Channel<T>,就是 .NET 为这类...
BlockingCollection<T> 内部机制与最佳实践
唐青枫
1 月 20 日
阅读 11 分钟
1.1k
BlockingCollection<T> 是 .NET 中非常重要且实用的线程安全、阻塞式的生产者-消费者集合类,位于 System.Collections.Concurrent 命名空间。
C#.NET ConcurrentDictionary<TKey, TValue> 深度解析:原理与实践
唐青枫
1 月 13 日
阅读 8 分钟
1.8k
ConcurrentDictionary<TKey, TValue> 是 System.Collections.Concurrent 命名空间下的线程安全的键值对集合,专为高并发读写场景设计 —— 相比传统 Dictionary<TKey, TValue> +lock 的方案,它采用细粒度锁(分段锁) 替代全局锁,大幅降低锁竞争,是 .NET 中实现线程安全键值存储的首选工具。
C#.NET ConcurrentBag<T> 设计原理与使用场景
唐青枫
1 月 12 日
阅读 5 分钟
1.4k
ConcurrentBag<T> 是 System.Collections.Concurrent 命名空间下的线程安全的无序集合,专为 “多线程同时添加 / 移除元素” 设计,核心特点是基于线程局部存储(TLS)优化,在 “同一线程频繁添加和移除元素” 的场景下性能最优,是 .NET 中处理无序线程安全集合的核心工具。
深入理解 Volatile:C#.NET 内存可见性与有序性
唐青枫
1 月 7 日
阅读 4 分钟
1.2k
Volatile 是 C# 中处理内存可见性和指令重排序的关键机制,它提供了对内存访问的精细控制。在并发编程中,volatile 关键字和 Volatile 类都是解决共享变量可见性问题的重要工具。
你真的理解 Interlocked.Exchange 吗?C#.NET 原子操作详解
唐青枫
1 月 6 日
阅读 5 分钟
1.1k
Interlocked.Exchange 是 System.Threading.Interlocked 类中的静态方法,用于原子地替换(交换)一个变量的值,并返回该变量的旧值。整个读-改-写过程是不可分割的,在多线程环境中保证线程安全。
深入理解 System.Lazy<T>:C#.NET 延迟初始化与线程安全
唐青枫
1 月 5 日
阅读 8 分钟
1.2k
System.Lazy<T> 是 .NET Framework 4.0 引入(位于 System 命名空间)的泛型类,用于实现线程安全的延迟初始化(Lazy Initialization)。它确保一个昂贵的对象或资源只在第一次真正需要时才被创建,并且在多线程环境下保证初始化只发生一次。
深入理解 Interlocked.CompareExchange:C#.NET 原子操作核心原理
唐青枫
1 月 4 日
阅读 8 分钟
8.6k
Interlocked.CompareExchange 是 .NET 中 System.Threading.Interlocked 类的最核心原子操作方法。它执行比较并交换(Compare-And-Swap,简称 CAS) 操作:在多线程环境下,安全地将变量的值与预期值比较,如果相等则替换为新值,整个过程原子不可中断。
深入理解 Parallel.ForEachAsync:C#.NET 并行调度模型揭秘
唐青枫
1 月 1 日
阅读 3 分钟
996
简介 {代码...} 不是一次性启动所有任务是一个 “边消费、边执行、边补位” 的模型核心设计目标在异步场景下,维持固定并发度,持续消耗数据源,直到完成痛点ForEachAsync 的解法Task.WhenAll 不限流MaxDegreeOfParallelismSemaphoreSlim 模板繁琐内建async foreach 调度复杂自动处理调度模型核心:滑动窗口(Sliding Wind...
深入理解 C#.NET Parallel:并行编程的正确打开方式
唐青枫
2025-12-31
阅读 10 分钟
999
Parallel 并行编程是 .NET 中利用多核 CPU 进行并发执行的编程模型,主要通过 System.Threading.Tasks 命名空间中的 Parallel 类实现。它允许将任务分解成多个子任务,在多个线程上同时执行,以加速 CPU 密集型操作(如循环计算、数据处理)。
深入理解 C#.NET Interlocked.Increment:原子操作的核心
唐青枫
2025-12-30
阅读 7 分钟
1k
Interlocked.Increment 是 .NET 中一个重要的线程安全操作方法,用于以原子方式递增变量的值。它位于 System.Threading 命名空间中,提供了一种轻量级的线程同步机制。
深入理解 C#.NET IEnumerable<T>:一切集合的起点
唐青枫
2025-12-29
阅读 7 分钟
991
IEnumerable<T> 是 .NET 中最核心的接口之一,位于 System.Collections.Generic 命名空间中。它代表一个可枚举的集合,支持在集合上进行迭代操作。
C#.NET 索引器完全解析:语法、场景与最佳实践
唐青枫
2025-12-25
阅读 7 分钟
1.3k
索引器(Indexer)是 C# 中的一种特殊属性,它允许类或结构体像数组一样使用索引语法(例如 obj[0])来访问或修改对象内部的成员。简单来说,它将对象的实例视为“可索引的集合”,提供类似于数组的访问方式。
上一页
1
2
3
(current)
4
5
…
More
下一页
上一页
3
(current)
下一页