Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 从区域中删除视图时内存泄漏_.net_Wpf_Mvvm_Prism_Mef - Fatal编程技术网

.net 从区域中删除视图时内存泄漏

.net 从区域中删除视图时内存泄漏,.net,wpf,mvvm,prism,mef,.net,Wpf,Mvvm,Prism,Mef,我创建了游戏管理器,它可以使用PRISM MEF在该地区选择不同的游戏。“MainRegion”中有一个静态外壳和动态内容。每个游戏都是独立的模块(组件),当我获得实例时,每个游戏大约分配20-30MB 每个游戏我都有这样的组件: MainView[CreationPolicy.Shared] 视图1[CreationPolicy.Shared] ViewN[CreationPolicy.Shared] MainViewModel[CreationPolicy.Shared] Vie

我创建了游戏管理器,它可以使用PRISM MEF在该地区选择不同的游戏。“MainRegion”中有一个静态外壳和动态内容。每个游戏都是独立的模块(组件),当我获得实例时,每个游戏大约分配20-30MB

每个游戏我都有这样的组件:

  • MainView[CreationPolicy.Shared]
    • 视图1[CreationPolicy.Shared]
    • ViewN[CreationPolicy.Shared]
  • MainViewModel[CreationPolicy.Shared]
    • ViewModel1[CreationPolicy.Shared]
    • ViewModelN[CreationPolicy.Shared]
通过调用创建的每个“视图”(主视图、第一视图、第二视图…)

_serviceLocator.GetInstance<MainView>();
当我想更改游戏时,我从
MainRegion
中删除
MainView
,但它不会创建新实例,因为
PartCreationPolicy
设置为
Shared
,但如果我使用
NonShared
则在删除实例后会出现内存泄漏


如何在我的应用程序中修复此内存泄漏?

解决此泄漏的关键是首先使用内存探查器了解它,并确定对象保留在内存中的原因以及哪个对象持有对它们的引用

由于您没有在问题中提供此类信息,我将指出导致此泄漏的一个非常可能的原因是您的对象实现了
IDisposable
。MEF存在一个已知的问题,即保留对一次性物品的引用而不释放它们。如果确实如此,您可以查看此问题以了解更多详细信息和可能的解决方案:。另一种可能性是,您的一个导入被配置为允许重新编译——在这种情况下,MEF还将保留对您的对象的引用

您还应该记住,GC仅在需要时执行垃圾收集,而不一定在删除实例之后立即执行。您可以自己调用垃圾收集器,以确保对象确实保存在内存中:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

如果您的对象不是一次性的,并且没有允许重新编译的导入,那么对它们的引用很可能由您自己的代码保存,并且您必须分析您的应用程序,以确定由谁创建。为此,我建议使用。

你说它有内存泄漏是什么意思?是您删除了它,实例没有被破坏还是被破坏?实例被破坏了,但TaskManager告诉我使用的内存没有减少,所以如果我选择一次游戏,应用程序使用50 MB内存,但如果我选择游戏更多次(进入菜单选择游戏进入菜单选择游戏-…-…-等等),它将“吃”越来越多的内存
[Import(AllowRecomposition = false)]
public MainViewModel ViewModel //example for MainView
{
    get { return this.DataContext as MainViewModel; }
    set { this.DataContext = value; }
}