评审基线:StreamFrame 2.6.0,提交 4b892d9eaa11cf003b5d10793e735b0604bc17ed(2026-09-08 仓库评审)。
问题与影响
P2,已独立复现。 Shutdown 仅取消当时已存在的 _whenConnected;Dispose 完成后再次调用 WaitForConnectedAsync,会新建没有任何完成者的 TCS。不传调用方取消令牌时永久等待;Dispose 与首次等待并发也存在对应窗口。
位置:src/StreamFrame/Connection/StreamConnection.cs:1046,GetOrCreateWhenConnected 与 Shutdown。
现有测试覆盖的是“先等待,再 Dispose”,缺少反向顺序和并发:test/StreamFrame.Tests/ConnectionUsabilityTests.cs:82。
复现
Windows、.NET 8.0.30;在现有测试项目可复用 StringCodec.Instance:
var connection = new StreamConnection<string>(
new LengthPrefixFramer(), StringCodec.Instance,
IPAddress.Loopback, 12345, isActive: true);
await connection.DisposeAsync();
var wait = connection.WaitForConnectedAsync();
await Task.Delay(100);
Assert.True(wait.IsCompleted); // 当前失败:WaitingForActivation
此路径不需要启动网络连接。
建议与验收
实施按 AGENTS.md:从最新 main 建分支、同步 CHANGELOG Unreleased、通过 Release build/test、走 PR;本 Issue 仅登记工作,不代表已实施修复。
评审基线:StreamFrame 2.6.0,提交
4b892d9eaa11cf003b5d10793e735b0604bc17ed(2026-09-08 仓库评审)。问题与影响
P2,已独立复现。 Shutdown 仅取消当时已存在的 _whenConnected;Dispose 完成后再次调用 WaitForConnectedAsync,会新建没有任何完成者的 TCS。不传调用方取消令牌时永久等待;Dispose 与首次等待并发也存在对应窗口。
位置:src/StreamFrame/Connection/StreamConnection.cs:1046,GetOrCreateWhenConnected 与 Shutdown。
现有测试覆盖的是“先等待,再 Dispose”,缺少反向顺序和并发:test/StreamFrame.Tests/ConnectionUsabilityTests.cs:82。
复现
Windows、.NET 8.0.30;在现有测试项目可复用 StringCodec.Instance:
此路径不需要启动网络连接。
建议与验收
实施按 AGENTS.md:从最新 main 建分支、同步 CHANGELOG Unreleased、通过 Release build/test、走 PR;本 Issue 仅登记工作,不代表已实施修复。