SuperAPI AI 工具集

dotnet-channels

通用与其它

查看项目

更新于 10-16 01:27

技能介绍

用途:介绍 .NET 中 System.Threading.Channels,用于高性能、线程安全的生产者/消费者通信。Channel<T> 提供分离的 ChannelWriter<T> 与 ChannelReader<T> 端点,通道内部处理全部同步。

主要能力:

  • 创建通道:Channel.CreateUnbounded<T>() 或 Channel.CreateBounded<T>(capacity)。有界通道通过 BoundedChannelOptions.FullMode 控制写满时的行为:Wait(默认,阻塞直到有空间)、DropOldest、DropNewest、DropWrite(TryWrite 返回 false)。.NET 7+ 支持 itemDropped 回调,用于丢弃时的指标、日志或资源清理。
  • 生产者:WriteAsync 支持背压;TryWrite 为非阻塞快速路径。多生产者可并发调用,无需外部锁。不再生产时调用 Complete()/TryComplete(),可带异常。
  • 消费者:推荐 WaitToReadAsync + TryRead 双循环,先同步排空缓冲再等待,减少异步状态机开销;也可用 ReadAsync 并捕获 ChannelClosedException。多消费者扇出时每个条目只被一个消费者读取。
  • IAsyncEnumerable:ReadAllAsync() 返回 IAsyncEnumerable<T>,支持 await foreach,可直接用于 ASP.NET Core 流式响应;配合 System.Linq.Async 可使用 Where、Buffer 等操作符。
  • 性能:SingleReader/SingleWriter 标志启用无锁优化,但违反承诺会导致数据损坏。
  • 取消与关闭:向异步操作传入 CancellationToken;排空模式先 TryComplete 再消费剩余条目,可设置排空截止时间;宿主默认关闭超时为 30 秒,可通过 HostOptions.ShutdownTimeout 调整。

限制与注意:生产环境避免无界通道导致内存耗尽;不要违反 SingleReader/SingleWriter;不要忘记 Complete(),否则消费者会无限等待;不要在 itemDropped 回调中阻塞。托管服务生命周期与 BackgroundService 注册、async/await 基础与取消令牌传播属于其他技能范围。