C# 将视图从区域中删除后,不会释放该视图
将选项卡添加到应用程序中,我意识到在我从C# 将视图从区域中删除后,不会释放该视图,c#,wpf,object,prism,C#,Wpf,Object,Prism,将选项卡添加到应用程序中,我意识到在我从区域中删除子视图后,它们不会被释放(最终确定) regionManager.Regions[regionName].Remove(tabItem.Content); 每次关闭选项卡并重新打开它时,都会正确创建一个新实例,但在我关闭应用程序之前,旧实例一直保持打开状态。通过终结器断点检查它。这会导致我的应用程序不释放区域,并在区域管理器尝试创建一个已经存在的区域时崩溃 甚至 将从区域中删除该对象,但该对象仍处于活动状态。我遇到了类似的问题,我今天早上刚刚
区域
中删除子视图后,它们不会被释放(最终确定)
regionManager.Regions[regionName].Remove(tabItem.Content);
每次关闭选项卡并重新打开它时,都会正确创建一个新实例,但在我关闭应用程序之前,旧实例一直保持打开状态。通过终结器
断点检查它。这会导致我的应用程序不释放区域
,并在区域管理器
尝试创建一个已经存在的区域时崩溃
甚至
将从
区域中删除该对象,但该对象仍处于活动状态。我遇到了类似的问题,我今天早上刚刚解决了它
在使用regionManager添加新区域之前,请使用以下方法检查该区域是否已存在:
this.regionManager.Regions.ContainsRegionWithName("Your region name")
然后,当我从区域中删除视图时,我只调用垃圾收集器GC.Collect()方法来“处置”删除的视图并释放内存
但是,请确保在视图中使用属性[RegionMemberLifetime(KeepAlive=false)]
有关详细信息,请参阅
编辑
另一个解决方案,使用一次性模式,我也用于一些视图
如果my view实现IDisposable接口,则该方法如下所示:
public void Dispose()
{
GC.SuppressFinalize(this);
}
之后,从区域中删除视图时,只需调用Dispose方法:
myRegion.Deactivate(view);
myRegion.Remove(view);
var disposable = view as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
请注意,我使用的是mvvm模式,我不必释放任何其他托管对象,否则,如果您的视图中有一些托管对象,请查看更多关于某个地方仍然有对区域(选项卡)的引用,这就是为什么它没有被正确处置的原因。您能解释一下这是如何可能的吗?您可以通过调用IRegion.remove()
从区域中删除视图,但之后视图仍然可见吗?然后,它不是关于处理或终结,而是关于从区域中删除视图。我正按照您所说的做-即使是GC.Collect()-但引用仍在使用中,实例未被处理。我如何知道它在哪里使用?@JohannesWanzek 1)你如何测试它?2) 您使用的是MVVM模式吗?@JohannesWanzek我刚刚查看了我的代码,我可以确认在从区域中删除视图并调用GC.Collect()后,实例已被释放(我通过在终结器上使用您的方法断点进行了测试)。您可以在删除区域之前调用区域。取消激活(视图)。
myRegion.Deactivate(view);
myRegion.Remove(view);
var disposable = view as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}