评审基线:StreamFrame 2.6.0,提交 `4b892d9eaa11cf003b5d10793e735b0604bc17ed`(2026-09-08 仓库评审)。 ## 问题 这是 API 文档和使用边界改进项。 1. [src/StreamFrame/Codec/ICodec.cs:11](https://github.com/CSJ608/StreamFrame/blob/4b892d9eaa11cf003b5d10793e735b0604bc17ed/src/StreamFrame/Codec/ICodec.cs#L11) 仅描述 Decode/Encode 功能,未明确 ReadOnlySequence、IBufferWriter 的使用寿命与实现需满足的并发约束。Decoder 在消费后推进/释放池化管线,返回消息若直接引用输入帧内存可能在业务消费时失效。 2. 同一连接编码与解码可并行,旧解码任务在背压等情况下可能与新会话任务重叠;一个 Codec 实例跨连接共享也需明确责任。 3. README 推荐 byte[] / ReadOnlyMemory<byte> 消息类型,但缺少完整的安全所有权示例。 4. 默认 ReceiveQueueCapacity=0 为无界接收队列;快速上手未展示慢消费者场景的容量与背压配置。框架单客户端监听的产品边界也宜在示例附近明确。 ## 建议范围 - 明确 Decode 只能在同步调用期间借用 frame;返回的消息必须拥有其数据,不能未经拷贝保留管线切片。 - 明确 Encode 对 writer 的引用与异步保留限制。 - 根据实际调用模型写明并发/重入约束;必要时包括 IFramer 实例共享的责任。不能仅凭“发送 worker 串行”宣称整个 Codec 不需线程安全。 - 给出可编译的 byte[]/ReadOnlyMemory<byte> Codec 示例,展示需要保留时的拷贝或受支持的所有权转移方式。 - 增加生产配置示例:有界接收/发送队列、半帧大小限制、超时选择、取消和 Dispose;解释队列容量按消息数而非总字节预算计量。 - 区分快速入门与适合具体吞吐/消息大小的配置,不直接修改现有默认值。 - 同步 README 双语与 XML API 文档,并清理与实际行为冲突的说明。 ## 验收 - [ ] 自定义驱动作者仅凭公开文档即可判断哪些内存能留存、哪些方法可能并行。 - [ ] 示例能编译,异步消费时数据正确,不依赖池化内存碰巧未复用。 - [ ] 有界队列示例解释慢消费者背压及消息大小对内存占用的影响。 - [ ] 明确这是单连接/单客户端设备对接库,避免将监听模式理解成通用多客户端服务器。 - [ ] 关联 KeepAlive 单位修复,示例使用其修复后的实际语义。 实施按 AGENTS.md:从最新 main 建分支、同步 CHANGELOG Unreleased、通过 Release build/test、走 PR;本 Issue 仅登记工作,不代表已实施修复。 相关修复:#62(KeepAlive 单位)、#65(终态等待);文档与示例应体现修复后的契约。
Activity
CSJ608 commentedon Sep 8, 2026
已由 PR #78 rebase 合并,main 提交
831f7ff9bda43f4033b040e43e8cf28eda928f3b。验收已完成:公开 ICodec/IFramer/流式定界 XML 和双语 README 明确借用内存、同步 writer、收发/新旧会话/跨连接共享责任;提供 byte[] 与 ReadOnlyMemory 安全拷贝示例及有界生产配置,说明按消息数计量、慢消费背压、超时/取消/Dispose、单客户端边界,并对齐 #62/#65/#67 语义。默认值与实现公共契约不变。
示例源文件原样纳入 net8/net10/net48 编译;4 项新增所有权测试主动覆盖单段/多段原始内存,并用归还即填充 0xDD 的内存池执行真实 FrameDecoder,释放管线后异步消费仍正确。Release build 0 警告/错误;完整 test:net8/net10 各 132 通过、net48 124 通过,各 3 项长测默认跳过,0 失败。
PR CI/CodeQL 全绿,合并后 main CI 与 main CodeQL 均成功;实施分支已删除。#66/#67 夜间长测仍独立验收。