SuperAPI AI 工具集

csharp-concurrency-patterns

通用与其它

查看项目

更新于 10-16 01:12

技能介绍

用途:在 .NET 中处理并发时,判断该用哪种抽象。核心哲学是“从简单开始,只在确有需要时升级”,优先通过不可变数据、消息传递和隔离状态(如 actor)从设计上消除共享可变状态,锁应为例外。

主要能力:提供决策树,按目标选择方案——等待 I/O 用 async/await;CPU 密集型集合并行用 Parallel.ForEachAsync;生产者/消费者工作队列用 System.Threading.Channels;UI 事件去抖、节流、组合用 Reactive Extensions;服务端流处理(背压、批处理)用 Akka.NET Streams;复杂状态机用 Akka.NET Actors 的 Become 模式;多独立实体状态用 entity-per-actor;协调多个异步操作用 Task.WhenAll/WhenAny。

共享可变状态的处理顺序:先重新设计避免;其次用 System.Collections.Concurrent;再次用 Channel<T> 串行化访问;最后才用 lock 保护简单短临界区。同步原语选择:标量用 Interlocked;键值或队列用 ConcurrentDictionary/ConcurrentQueue;临界区含 await 用 SemaphoreSlim;多读少写且经性能分析确认争用才用 ReaderWriterLockSlim;极短高争用临界区可考虑 SpinLock。

必要用法:async/await 应始终接受 CancellationToken,库代码用 ConfigureAwait(false),不要用 .Result 或 .Wait() 阻塞。Parallel.ForEachAsync 通过 ParallelOptions 设置 MaxDegreeOfParallelism 与 CancellationToken。Channels 可用 Channel.CreateBounded 设置容量与 FullMode,通过 Writer.WriteAsync 与 Reader.ReadAllAsync 读写。

限制与注意:Parallel 不保留顺序,不适合纯 I/O、需要背压或流控的场景;Channels 不适合复杂流操作、按实体有状态处理与复杂错误监督;Rx 适合 UI 与客户端组合,服务端分布式处理应选 Akka.NET Streams。ConcurrentDictionary 的 GetOrAdd 工厂委托在争用下可能执行多次,需精确一次语义时用 Lazy<T> 包装。锁对象须为私有专用字段,禁止锁 this、typeof(T)、字符串字面量或值类型。资料未提供安装命令、收费与平台信息。