メモリが不足した後に停止するWPFアプリがあります...
これは基本的に、LinqToSqlまたはGeneratedクラスICTemplates.Segmentのインスタンスであるノードを表示するTreeViewです。ORデザイナのこのクラスに関連付けを介して間接的にリンクされた約20のテーブルがあります。
<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という明示的なプロパティを追加しました。
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コントロールのセットとして表示します。
応答時間までに、子がオンデマンドでロードされていることを確信しています(親を拡張したとき)。約70の子を持つノードを展開すると、子が読み込まれるまでにしばらく時間がかかります(タスクマネージャーはMemの使用状況を1000000Kと表示します!)。次のノードを約50人の子で拡張すると、BOOM!OutOfMemoryException
VSプロファイラーを実行してさらに深く掘り下げました。結果は次のとおりです。
上位3つは、Action、DeferredSourceFactory.DeferredSource、およびEntitySet(すべての.Net / LINQクラス)です。唯一のユーザークラスはSegment[]であり、Segmentは#9と#10で提供されます。
私は追求するためのリードを考えることができません..理由は何でしょうか?