C# Net中可观察集合的内存管理

C# 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

我正在处理一个WPF应用程序,其中我正在处理CustomObject的ObservableCollection

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>