You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DevExpress选项卡窗体关闭后内存未释放 重复开关内存持续攀升

DevExpress WinForms 内存线性增长问题排查与修复方案

核心特征:每次打开关闭FrmWeldingProduction后内存固定上涨约130MB,关闭后无回落,已手动执行Dispose与事件解绑仍存在泄漏

高概率根因与对应修复

1. 事件订阅泄漏(最高优先级)

现有手动解绑逻辑遗漏了关键事件:

  • 未解绑firstLastTime.OK.Click到ProductionProject_Click的订阅:该事件持有当前窗体实例的强引用,即使调用firstLastTime.Dispose(),发布者对订阅者的引用仍会阻止GC回收当前窗体。
  • 无需手动逐个解绑控件事件:this.Dispose(true)会自动释放所有DevExpress控件的内部事件订阅,手动解绑容易遗漏,反而引入泄漏。
    修复操作:
    在DisposeFrm中新增事件解绑逻辑:
// 新增:解绑firstLastTime的OK按钮事件
if(firstLastTime != null && !firstLastTime.IsDisposed)
{
    firstLastTime.OK.Click -= ProductionProject_Click;
}

2. WorkspaceManager 全局缓存引用泄漏(DevExpress已知问题)

WorkspaceManager会在全局静态字典中缓存已加载的布局,同时强引用TargetControl,导致窗体关闭后无法被GC回收。
修复操作:
在DisposeFrm中新增两行清理代码:

// 断开WorkspaceManager对当前窗体的引用
workspaceManager1.TargetControl = null;
// 移除全局缓存中的当前布局
workspaceManager1.RemoveWorkspace(LayoutWeldingProduction);

3. 异步方法残留引用泄漏

所有async void事件处理方法的异步状态机,会在异步等待期间持有当前窗体的this引用,若窗体在异步任务执行期间被关闭,该引用会一直残留到任务执行完成,极端情况下会导致整个窗体实例被缓存。
修复操作:

  • 新增可取消的异步任务令牌字段:
private CancellationTokenSource _asyncCts;
  • 所有异步任务执行前初始化令牌,窗体关闭时取消所有未完成任务:
public void DisposeFrm()
{
    // 新增:取消所有未完成的异步操作
    _asyncCts?.Cancel();
    _asyncCts?.Dispose();
    // 原有逻辑...
}
  • 所有异步方法传入_asyncCts.Token,在异步回调前检查取消状态,避免残留引用。

4. 业务类实例未正确Dispose

welding为readonly字段,现有逻辑仅Dispose了us实例,未Dispose持有数据库连接的CLS_Welding实例,导致数据库连接、缓存对象一直被持有。
修复操作:
在DisposeFrm中新增:

// 释放welding实例
if(welding is IDisposable weldingDisposable)
{
    weldingDisposable.Dispose();
}

验证方法

  • 不要依赖任务管理器判断内存泄漏,使用Visual Studio内置诊断工具的.NET对象跟踪功能:
    1. 启动调试后开启诊断工具,执行1次打开-关闭窗体操作,拍快照
    2. 连续执行3次打开-关闭操作,再次拍快照
    3. 对比快照中FrmWeldingProduction的实例数量,若大于1则确认泄漏,同时可查看持有该实例的引用链定位具体漏项。
  • 确认DevExpress Tabbed View关闭选项卡时,已正确移除关联的文档对象,未对已关闭窗体保留强引用。
  • 临时注释掉WorkspaceManager的加载、保存逻辑,测试内存是否仍线性上涨,快速定位是否为WorkspaceManager导致的泄漏。

内容的提问来源于stack exchange,提问作者M.Bouabdallah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 03:57:02