C# Net中可观察集合的内存管理
我正在处理一个WPF应用程序,其中我正在处理CustomObject的ObservableCollectionC# Net中可观察集合的内存管理,c#,wpf,garbage-collection,observablecollection,C#,Wpf,Garbage Collection,Observablecollection,我正在处理一个WPF应用程序,其中我正在处理CustomObject的ObservableCollection public ObservableCollection<ProjectsToShow> Projects{get;set;} 将从内存中释放所有对象,但不会以这种方式工作。即使我尝试将项目设置为null,但即使这样也不起作用。WellsToShow和DatasetToShow的对象仍然保留内存。因此,出于测试目的,我尝试使用此代码 foreach(var project
public ObservableCollection<ProjectsToShow> Projects{get;set;}
将从内存中释放所有对象,但不会以这种方式工作。即使我尝试将项目设置为null,但即使这样也不起作用。WellsToShow和DatasetToShow的对象仍然保留内存。因此,出于测试目的,我尝试使用此代码
foreach(var project in MainViewModel.Projects)
{
foreach(var well in project.Wells)
{
well.Datasets.Clear();
}
project.Wells.Clear();
}
MainViewModel.Projects.Clear();
根据内存分析器,它们不再在内存中。对于记录,每次我运行探查器时,它都会先运行GC.Collect,然后再进行分析
请解释一下这东西是怎么工作的。如果这是清除集合的正确方法,那么我需要在所有项目中运行并修复此问题
更新1,将此集合绑定到视图
我正在将我的项目属性绑定到TreeView控件,并在调查it探查器后进行绑定。这个控件控制着我的集合,我认为清除items源集合应该可以完成这项工作,但这里不是这样
<TreeView VirtualizingStackPanel.IsVirtualizing="False" ItemsSource="{Binding Projects}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type bll:ProjectsToShow}" ItemsSource="{Binding Wells}">
<TextBlock HorizontalAlignment="Stretch" Text="{Binding ProjectName}" x:Name="TextBlockProject" Tag="{Binding DataContext,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}">
<TextBlock.ContextMenu>
<ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}" >
<MenuItem
Command="{Binding FileEditProjectCommand}">
<MenuItem.Header>
<TextBlock Text="{DynamicResource EditProject}"/>
</MenuItem.Header>
</MenuItem>
<MenuItem Command="{Binding FileDeleteProjectCommand}">
<MenuItem.Header>
<TextBlock Text="{DynamicResource DeleteProject}"/>
</MenuItem.Header>
</MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type bll:WellsToShow}" ItemsSource="{Binding Datasets}">
<TextBlock HorizontalAlignment="Stretch" Text="{Binding WellName}" Tag="{Binding DataContext,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}">
<TextBlock.ContextMenu>
<ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
<MenuItem Command="{Binding FileEditWellCommand}">
<MenuItem.Header>
<TextBlock Text="{DynamicResource EditWell}"/>
</MenuItem.Header>
</MenuItem>
<MenuItem Command="{Binding FileDeleteWellCommand}">
<MenuItem.Header>
<TextBlock Text="{DynamicResource DeleteWell}"></TextBlock>
</MenuItem.Header>
</MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
更新2附加屏幕截图
如果与集合中的对象相对应的可视对象,则这些可视对象将在各自的数据上下文中保留这些引用。确保仅在目测清除对象后运行内存配置文件
我还建议进行任何WPF调试工作,因为这可能会显示您的对象以及引用它们的内容。如果您使用的是探查器,请检查哪些对象导致井和数据集被根化。它可能是一个绑定到视图模型的视图,使它们保持活动状态。您能在视图中显示绑定吗?@mikez我已经更新了这个问题。请现在开始研究。@MegaMind-Profiler还会告诉您根对象的详细信息。查看引用中保存的对象。@RohitVats主窗口->树视图->系统.Windows.DataBinding->DatasetsToShow
Projects.Clear();
foreach(var project in MainViewModel.Projects)
{
foreach(var well in project.Wells)
{
well.Datasets.Clear();
}
project.Wells.Clear();
}
MainViewModel.Projects.Clear();
<TreeView VirtualizingStackPanel.IsVirtualizing="False" ItemsSource="{Binding Projects}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type bll:ProjectsToShow}" ItemsSource="{Binding Wells}">
<TextBlock HorizontalAlignment="Stretch" Text="{Binding ProjectName}" x:Name="TextBlockProject" Tag="{Binding DataContext,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}">
<TextBlock.ContextMenu>
<ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}" >
<MenuItem
Command="{Binding FileEditProjectCommand}">
<MenuItem.Header>
<TextBlock Text="{DynamicResource EditProject}"/>
</MenuItem.Header>
</MenuItem>
<MenuItem Command="{Binding FileDeleteProjectCommand}">
<MenuItem.Header>
<TextBlock Text="{DynamicResource DeleteProject}"/>
</MenuItem.Header>
</MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type bll:WellsToShow}" ItemsSource="{Binding Datasets}">
<TextBlock HorizontalAlignment="Stretch" Text="{Binding WellName}" Tag="{Binding DataContext,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}">
<TextBlock.ContextMenu>
<ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
<MenuItem Command="{Binding FileEditWellCommand}">
<MenuItem.Header>
<TextBlock Text="{DynamicResource EditWell}"/>
</MenuItem.Header>
</MenuItem>
<MenuItem Command="{Binding FileDeleteWellCommand}">
<MenuItem.Header>
<TextBlock Text="{DynamicResource DeleteWell}"></TextBlock>
</MenuItem.Header>
</MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>