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

排查PRISM导航传参引发的内存泄漏问题

Prism导航参数引发ViewModel内存泄漏排查求助

问题现象

  • 实现IDisposable接口的ScanContextVm对象,作为参数传入Prism的RequestNavigate方法后,永远无法被释放,即使手动触发强制垃圾回收(GC)也无效。
  • 若注释掉NavigationParameters中的Scan参数,ScanContextVm能正常被回收,终结器可被调用。
  • 导航目标页面的OnNavigatedTo方法未处理任何导航参数,不存在页面缓存或参数引用导致的泄漏。
  • 持续操作1小时会不断累积泄漏对象,始终看不到ScanContextVm的终结器/Dispose方法被执行。

关键代码片段

触发泄漏的导航代码

void AnalyzeContext(ScanContextVm ctx) // 将ctx传入参数会引发泄漏
{
    _regionManager.RequestNavigate("Main", "Analyze", 
        new NavigationParameters {{"Scan", ctx}});
});

无泄漏的导航代码(注释参数)

void AnalyzeContext(ScanContextVm ctx)
{
    _regionManager.RequestNavigate("Main", "Analyze", 
        new NavigationParameters { /*{"Scan", ctx}*/ });
});

导航目标页面的导航实现

public void OnNavigatedTo(NavigationContext ctx) {}

排查用强制GC代码(临时添加)

GC.Collect(2);
GC.Collect(1);
GC.Collect(0);
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();

已完成的排查动作

  • 检查Prism源码:RequestNavigate流程中无缓存NavigationParameters的逻辑,ParametersBase基类仅通过List<KeyValuePair<string, object>>存储参数,未发现异常。
  • 自定义可回收参数测试:继承NavigationParameters并实现IDisposable,确认参数对象本身能被GC回收,但其中的ScanContextVm仍无法释放。

求助方向

求内存泄漏排查的可行方案,如何定位导致ScanContextVm无法被释放的根引用?

补充环境:.NET 6、Prism 8.1.97

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:16:04