Skip to content

fix(ipc): 修复广播期间连接变化导致的崩溃 - #2017

Open
FXDYJ wants to merge 1 commit into
ClassIsland:masterfrom
FXDYJ:codex/fix-ipc-broadcast-race
Open

FXDYJ wants to merge 1 commit into
ClassIsland:masterfrom
FXDYJ:codex/fix-ipc-broadcast-race

Conversation

@FXDYJ

@FXDYJ FXDYJ commented Sep 25, 2026 •

Copy link
Copy Markdown

类型

  • Bug 修复

这个 Pull Request 做了什么?

修复 IPC 广播期间对等端连接或断开导致的崩溃。课程状态切换会通过 async void 事件处理器调用广播;此前直接遍历 ConnectedPeers,并在循环中 await 发送,连接回调此时增删集合会抛出 InvalidOperationException(Collection was modified),继而传播到 UI Dispatcher。

现场报告版本为 2.1.0.1,从不上课进入第一节课时崩溃:

  • TraceID: 5382ab11c2da4148a1613e349fa013ba
  • IpcService.BroadcastNotificationAsync(String id):45
  • LessonsService.<.ctor>b__108_1:246

核对了稳定版 2.1.0.1、测试版 2.1.1.1、master 和 develop/v2/misha-alpha,均保留该遍历方式。未找到已合并或进行中的对应竞态修复。

实现说明

  • 私有连接集合改为 List;连接增删和创建快照使用同一把锁。
  • 两个广播重载均在锁外遍历快照并异步发送,不跨 await 持有锁或枚举共享集合。
  • 逐个对等端处理 IpcPeerConnectionBrokenException,以及包装 IOException / ObjectDisposedException 的 IpcRemoteException;记录对等端、通知 ID 和异常后继续通知其他客户端。
  • 其余异常继续传播,不用宽泛 catch 隐藏序列化或程序错误。
  • 不改公共 API、通知标识符或配置。

依赖版本 dotnetCampus.Ipc 2.0.0-alpha410 的 NotifyAsync 会把写管道期间的异常包装为 IpcRemoteException;该分支已在真实命名管道的断开竞态测试中复现。

相关 Issue

Related to #602;#1325 已标记为其重复问题。历史 #475 / #487 处理的是 IPC 广播中的空引用异常,与本次集合枚举竞态不同。

验证

在 Windows 上完成:

  • dotnet build ClassIsland.Desktop/ClassIsland.Desktop.csproj -c Debug 成功;最终修改后再次构建成功,0 errors(增量构建 264 warnings)。
  • 临时回归项目直接链接生产 IpcService.cs,使用可控传输替身验证两个重载:空集合、发送挂起时新增/移除连接、发送期间断开、包装的 IO/Dispose 异常、其他异常继续传播、并发连接增删与广播,18/18 通过。原始代码在前一轮 12 项对照测试中有 8 项失败,其中新增/移除连接确定性复现 Collection was modified。
  • 另一个临时项目直接链接生产 IpcService、IpcPeer、IIpcService,使用真实 dotnetCampus.Ipc 2.0.0-alpha410 和独立随机管道名进行验证:正常发送、快照含已断开的真实传输对象、100 次连接/断开与广播交叠;正常客户端收到全部 102 次无参数及 102 次带参数通知,无未处理异常。
  • git diff --check 通过。

上述临时测试项目不包含在本 PR;本 PR 仅修改 IpcService.cs。未在报告故障的教室机器上执行课程切换和插件组合端到端验证,也未判定现场具体由哪个客户端触发连接变化。

分支与审查说明

贡献指南建议稳定版 Bug 修复以对应维护分支为基础。已核对上游分支,目前没有 2.1 维护分支,因此本 PR 基于最新 master(235914a2);现有 2.0 分支对应旧版本。

本次代码实现与本地验证由 Codex 根据提交者提供的故障信息和指示完成。目前尚未经过人工代码审查;自动测试和静态检查不代表人工审阅。贡献指南不建议在没有人为干预的情况下完全使用生成式 AI 实现贡献,合并前应由提交者或维护者审阅该补丁。

本 PR 不涉及 UI 变化,因此没有附加截图或录屏;验证证据为上面的构建、回归及真实命名管道测试结果。

检查清单

  • 我阅读并已经在本地测试过这个 PR,验证范围及限制见上文。
  • 我已阅读并遵循贡献指南。

@FXDYJ
FXDYJ requested review from a team and HelloWRC as code owners September 25, 2026 06:34

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant