我有一個WPF應用程序正在研磨到內存不足時暫停...
它基本上是一個TreeView顯示節點,它是Linq To Sql或生成的類ICTemplates.Segment的實例。在OR設計器中,通過關聯間接鏈接了大約20個表。爲什麼我的WPF Treeview綁定到LinqToSql類是內存豬?
<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的顯式屬性給segment類,它使用父子記錄查找另一個表。
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;
}
}
其餘部分是數據綁定耦合數據模板,以顯示每個段作爲一組UI控件。
我非常確定,孩子們正在按需加載(當我展開父母)按響應時間。當我使用大約孩子展開一個節點時,加載子項需要一段時間(任務管理器顯示內存使用量爲1000000K!)。如果我用大約50個孩子展開下一個節點,BOOM! OutOfMemoryException異常
我跑VS探查深入挖掘和這裏的結果
Summary Page Object Lifetimes Allocation
排名前3名的行動,DeferredSourceFactory.DeferredSource和EntitySet的(所有的.NET/LINQ類) 。唯一的用戶類是Segment []和Segment分別以#9和#10進入。
我想不出一個主角去追求..可能是什麼原因?
更新後的問題...我爲每個查詢設置一次DataContext ...不是針對每個元素/節點。 – Gishu 2009-01-09 06:54:48