У меня есть приложение WPF, которое останавливается после нехватки памяти ...
Это в основном TreeView отображающие узлы, которые являются экземплярами Linq To Sql ИЛИ Сгенерированного класса ICTemplates.Segment. Там около 20 таблиц, косвенно связанных через ассоциации с этим классом в конструкторе OR.
<TreeView Grid.Column="0" x:Name="tvwSegments"
ItemsSource="{Binding}"
SelectedItemChanged="OnNewSegmentSelected"/>
<HierarchicalDataTemplate DataType="{x:Type local:Segment}" ItemsSource="{Binding Path=Children}">
...
// code behind, set the data context based on user-input (Site, Id)
KeeperOfControls.DataContext = from segment in tblSegments
where segment.site == iTemplateSite && segment.id == iTemplateSid
select segment;
Я добавил явное свойство Children в класс сегмента, который ищет другую таблицу с записями parent-child.
public IEnumerable<Segment> Children
{
get
{
System1ConfigDataContext dc = new System1ConfigDataContext();
return from link in this.ChildLinks
join segment in dc.Segments on new { Site = link.ChildSite, ID = link.ChildSID } equals new { Site = segment.site, ID = segment.id }
select segment;
}
}
Остальное - привязка данных в сочетании с шаблонами данных для отображения каждого сегмента в виде набора элементов управления пользовательского интерфейса.
Я почти уверен, что дети загружаются по требованию (когда я расширяю родительский) в зависимости от времени отклика. Когда я расширяю узел с 70 дочерними элементами, требуется некоторое время, прежде чем дочерние элементы загружаются (диспетчер задач отображает использование Mem как 1000000K!) Если я расширю следующий узел примерно с 50 детьми, БУМ! OutOfMemoryException
Я запустил Профилировщик VS, чтобы копать глубже, и вот результаты
Сводная страница
Время жизни объекта
Распределение
В топ-3 входят Action, DeferredSourceFactory.DeferredSource и EntitySet (все классы .Net / LINQ). Единственные пользовательские классы - это Сегмент [] и Сегмент с номерами № 9 и № 10.
Я не могу придумать, как вести. В чем может быть причина?