Skip to content

refactor(linkage): 重构ClassIsland IPC连接逻辑,统一服务管理 - #284

Closed
CreeperAWA wants to merge 3 commits into
SECTL:masterfrom
CreeperAWA:fix274
Closed

CreeperAWA wants to merge 3 commits into
SECTL:masterfrom
CreeperAWA:fix274

Conversation

@CreeperAWA

Copy link
Copy Markdown
Contributor
  1. 新增ClassIslandIpcConnection统一管理IPC连接,替换原分散在两个服务中的连接代码
  2. 重构课程联动服务的快照比较逻辑,忽略倒计时等动态字段避免误触发状态变更
  3. 调整课程联动刷新策略,仅在完全离线时轮询并延长轮询间隔
  4. 统一通知服务的IPC连接逻辑,复用新的连接管理类

fix #274

1.  新增ClassIslandIpcConnection统一管理IPC连接,替换原分散在两个服务中的连接代码
2.  重构课程联动服务的快照比较逻辑,忽略倒计时等动态字段避免误触发状态变更
3.  调整课程联动刷新策略,仅在完全离线时轮询并延长轮询间隔
4.  统一通知服务的IPC连接逻辑,复用新的连接管理类
@CreeperAWA
CreeperAWA marked this pull request as draft September 20, 2026 12:12
1. 为IPC连接断开添加500ms延迟重连,避免和ClassIsland的广播循环竞争
2. 新增对IPC连接断开异常的捕获处理,分别在存活检测和通知发送场景中静默处理断开情况并触发内置回退
重置下次连接尝试时间为最小值,当前重试延迟为最小延迟,允许立即重连,避免与 ClassIsland 的广播循环产生竞争。
@CreeperAWA
CreeperAWA marked this pull request as ready for review September 24, 2026 14:34
lzy98276 added a commit that referenced this pull request Sep 25, 2026
在 #284 的基础上补齐合入前必须修掉的问题:

- 刷新时始终写入新快照,只用语义比较决定是否通知订阅者。完全丢弃倒计时会让
  课前解禁、课后禁用延迟、课前重置和刷新调度读到陈旧值(#274 的自激循环来自
  事件通知,不来自快照写入)
- 恢复 SecRandom4Ci 插件版本门槛(1.2.0.0),旧插件不再被当作可用
- 退避期内立即返回,不再每次空等 10 秒;通知路径只等 1 秒,避免内置回退通知
  与抽取前就该打开的 QuickDraw 结果窗口被拖后
- 恢复 IsAlive/ShowNotification 的 1 秒 IPC 调用超时,失败改走 _logger
- 清理死常量与不准确的注释,Dispose 不再释放仍在使用的信号量
- 补测试:倒计时变化不通知但快照必须更新、课前解禁窗口按时打开、退避期快速返回、
  插件版本门槛;PluginDrawServiceTests 注册新的连接类型

fix #274
@lzy98276

Copy link
Copy Markdown
Member

感谢 @CreeperAWA 的重构 🙏

方向是对的,而且定位准确:#274 的自激来源就是「倒计时字段让快照每次都被判定为变化 → StateChanged → CourseLinkageHostedService 的刷新信号立刻唤醒 → 再刷新」,再加上联动与通知各建一条 IpcClient。统一连接 + 语义比较 + 拉长轮询都是正确的做法。

由于这个 PR 的 base 是 0737daf0,与当前 master 冲突,而且它的 ClassIslandScheduleSource.cs 还保留着旧的 IsLessonConfirmed 门槛与 Breaking/_ => Unknown 映射(直接合并会回退刚修复的 #278),另外它会让 3 个既有测试失败,所以我们把它 rebase 并修正后,以 #285 落地:

你的三个 commit 原样保留,作者仍是你(39a031bc / f01c2544 / eeb25886),只在末尾追加了一个维护者修复 commit。

修正的内容:

  1. 快照新鲜度:语义比较相等时不能直接 return,否则 _snapshot 的倒计时字段会停在旧值——课前解禁、课后禁用延迟、课前重置和刷新调度都只从这里读。现在改为「始终写入快照,只用语义比较决定是否通知订阅者」;疑似与ClassIsland联动出错 #274 的自激循环来自事件通知,不来自快照写入。
  2. 恢复 SecRandom4Ci 插件版本门槛(1.2.0.0):原 PR 删掉了 GetPluginVersion() 校验,MinimumPluginVersion 成了死常量,旧插件会被当作可用。
  3. 退避期内立即返回:GetLessonsServiceAsync 原本无论是否在退避都要轮询 10 秒,通知路径复用同一方法会把内置回退通知和「抽取前就该打开」的 QuickDraw 结果窗口拖后;现在通知路径只等 1 秒。
  4. 恢复 IsAlive() / ShowNotification() 的 1 秒调用超时,失败改走 _logger(原来的 Debug.WriteLine 在 Release 下进不了 data/logs)。
  5. 顺带清理死常量、修正「CurrentTimeStateChanged 每秒触发」的注释(ClassIsland 只在状态变化时广播,1 秒级的是它自己的主计时器)。

因为对该 fork 只有 pull 权限(maintainer_can_modify 为 true 但 git push 会被拒绝),无法直接在你的分支上改,所以改在上游提交。这个 PR 我先关闭,#285 已包含全部内容;如果你希望保留 PR 形式,欢迎基于最新 master rebase 后重开。

@lzy98276 lzy98276 closed this Sep 25, 2026
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.

疑似与ClassIsland联动出错

2 participants