using System.Threading.Channels; using SHH.Contracts; namespace SHH.CameraService { /// /// 视频数据内部总线 (线程安全的生产者-消费者通道) /// 作用:解耦 [采集编码线程] 与 [网络发送线程] /// public class VideoDataChannel { // 限制容量为 100 帧。如果积压超过 100 帧,说明发送端彻底堵死了,必须丢帧。 private readonly Channel _channel; public VideoDataChannel(int capacity = 10) { var options = new BoundedChannelOptions(capacity) { FullMode = BoundedChannelFullMode.DropOldest, // 核心策略:满了就丢弃最旧的帧 SingleReader = false, // 允许多个发送 Worker (如 CloudWorker, ScreenWorker) 同时读取 SingleWriter = true // 只有一个采集线程在写 }; _channel = Channel.CreateBounded(options); } /// /// [生产者] 写入一个封装好的数据包 (非阻塞) /// public bool WriteLog(VideoPayload payload) // 改为返回 bool { // TryWrite 在 DropOldest 模式下虽然几乎总是返回 true, // 但如果 Channel 被 Complete (关闭) 了,它会返回 false。 return _channel.Writer.TryWrite(payload); } /// /// [消费者] 读取器 /// public ChannelReader Reader => _channel.Reader; } }