排查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
相关产品推荐
相关产品推荐

