简介 Task 和 async/await 是 C# 异步编程的核心,也是最容易被表面化理解的一组概念。 开发中常见的说法往往是: Task 就是线程; await 会新开一...
简介 Task 和 async/await 是 C# 异步编程的核心,也是最容易被表面化理解的一组概念。 开发中常见的说法往往是: Task 就是线程; await 会新开一...
简介 在 .NET 异步里,如果你顺着这条线往下学: Task ValueTask IValueTaskSource 会发现难度是明显跳跃的。 Task 还是大多数业务代码的...
简介 在 .NET 里做性能优化时,很多人第一反应是: 少分配 少 GC 少临时对象 这个方向本身没有问题。 但问题在于,优化一旦开始,很容易走偏成另外一种极端: 看到对象创...
简介 在 .NET 项目里,只要分层稍微清晰一点,就绕不开这类代码: Entity -> Dto Request -> Command Command -> Aggregat...
简介 很多人第一次认真看 IL,通常不是因为“想学一门汇编”,而是因为碰到了这些问题: 同一段 C#,编译之后到底变成了什么 async/await、yield、lock 这...
简介 在 .NET 里提到同步,很多人第一反应通常是: 这没问题。 但只要你继续往下挖,很快就会碰到两个更底层的名字: 它们都能做“互斥”,但解决的问题并不是同一类。 一句话...
简介 很多人第一次认真看 gRPC,通常不是因为“想学一个新协议”,而是因为项目已经出现了这些信号: 服务和服务之间调用越来越多 REST 的 JSON 体积、契约漂移、字段...
简介 很多人第一次接触 TPL Dataflow,往往是在这种场景里: 有一批数据要按阶段处理 每个阶段都可能是异步的 有的阶段想并行,有的阶段又想限流 生产速度和消费速度不...
简介 只要你的 .NET 系统开始从单体走向微服务,很快就会遇到这个问题: 这时候你会发现,单库事务那套熟悉的心智模型开始失效了。 在单体应用里,你可以靠: SqlTrans...
简介 在 .NET 微服务里,只要你开始拆服务,很快就会遇到这几个现实问题: 服务实例越来越多,地址不固定 调用方不能再把 IP:Port 写死 某个实例挂了,调用方最好别继...
简介 在 .NET 里做并发集合选型时,只要需求里出现这几个关键词: 生产者-消费者 任务排队 消息缓冲 先来先处理 很多时候你真正要找的,其实不是 ConcurrentSt...
简介 在 .NET 里做并发集合选型时,很多人最先想到的是: ConcurrentDictionary<TKey, TValue> ConcurrentQueue<T> Co...
简介 在 .NET 里做并发控制时,最常见的默认答案通常还是: 这没有问题。 但有一类场景,普通互斥锁会显得有点“太保守”: 读很多 写很少 读操作彼此其实并不冲突 比如: ...
简介 在 .NET 里提到线程同步,很多人的第一反应还是: 这套写法本身没有问题,而且已经用了很多年。 但从 .NET 9 和 C# 13 开始,官方开始明确给出一个更推荐的...
简介 在 .NET 里,只要你开始深入看并发控制,很快就会发现这样一个现象: 大多数业务代码都用 lock 异步场景更常见的是 SemaphoreSlim / AsyncLo...
简介 SignalR 在单节点开发环境里通常很好用。 你本地起一个应用,前端连上来,消息一发,聊天室、通知、在线状态、协作编辑似乎都没什么问题。 但很多团队一到生产环境,问题...
简介 只要你开始深入看 .NET 的并行调度模型,很快就会碰到一个高频词: 很多文章会告诉你: 它是“工作窃取” 每个线程有自己的队列 队列空了就去偷别人的任务 这些说法当然...
简介 Task.Run 是 .NET 里最常见、也最容易被误解的 API 之一。 很多人对它的第一印象是: “开个后台线程” “把同步代码变异步” “防止阻塞当前线程” 这些...
简介 在 .NET 里,只要你开始关注性能,尤其是这些场景: 高频字符串处理; 协议解析和编码; 临时 byte / char 缓冲区; 循环里的小数组分配; 希望减少 GC...
简介 如果说: Span<T> 解决的是“如何高效操作一段连续内存”; Memory<T> 解决的是“如何跨异步边界持有连续内存”; ReadOnlySequence<T> ...