Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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
C# 将视图从区域中删除后,不会释放该视图_C#_Wpf_Object_Prism - Fatal编程技术网

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();
}