Skip to content

修复内存诊断与文件写入等待终结器导致的界面卡顿 - #723

Open
PANDAJSR wants to merge 2 commits into
InkCanvasForClass:net10from
PANDAJSR:fix/remove-blocking-finalizer-wait
Open

PANDAJSR wants to merge 2 commits into
InkCanvasForClass:net10from
PANDAJSR:fix/remove-blocking-finalizer-wait

Conversation

@PANDAJSR

@PANDAJSR PANDAJSR commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

问题说明

安装版 hang dump 捕获到两条会阻塞 WPF UI 的全局 finalizer 等待路径:

  1. ProcessProtectionManager.WithWriteAccess 中强制完整 GC 并同步等待所有 finalizer。日志、配置等普通文件写入会因此等待与目标文件无关的终结器;dump 中 finalizer 曾停在 WPF UI Automation 的 RawUiaNodeRelease。
  2. 自动内存诊断在 UI Dispatcher 上生成报告,GC.GetTotalMemory(forceFullCollection: true) 会触发完整回收并等待 finalizer。2026-10-21 的 dump 中,UI 线程正停在 AutomaticDumpTimer_Tick -> DumpToFile -> BuildReport -> AppendGcSection -> GC.GetTotalMemory(true),finalizer 同时停在 UI Automation 节点释放。

修改内容

  • 从 WithWriteAccess 的正常路径及门闩超时降级路径移除强制完整 GC 和同步 finalizer 等待;保留显式句柄释放、写入、门闩和保护锁恢复逻辑。
  • 自动内存报告将强制完整 GC 数值改为非强制 GC 快照,并明确标注为 snapshot,保留其余 GC 和 WPF 诊断数据。
  • Debug 页人工“强制 GC”诊断功能保留,但通过后台任务执行,避免等待期间冻结 UI。
  • WPF 窗口和视觉树仍在 UI Dispatcher 上采集,避免跨线程访问 WPF 对象。

验证情况

  • 使用 D 盘 .NET SDK 10.0.402 构建 x64 Debug 成功,0 个错误;存在 11 个既有依赖区域名称及未使用字段警告。
  • 覆盖本机安装版前完整备份到 D:\ICC-HangDumps\install-backups\20261021_091056。
  • 更新后的安装版已启动并保持响应;安装 DLL 与构建产物 SHA-256 一致。

范围说明

自动收纳检查中的 UI Automation 查询及其同步 Dispatcher 等待仍是独立风险,本 PR 未改变其业务行为。

@PANDAJSR PANDAJSR changed the title 修复文件写入时同步等待全局终结器导致界面卡顿 修复内存诊断与文件写入等待终结器导致的界面卡顿 Oct 21, 2026
@CJKmkp

CJKmkp commented Oct 21, 2026

Copy link
Copy Markdown
Member

修复相关移至net6分支pr

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.

2 participants