我有一个WPF应用程序,它在内存耗尽后停止运行.
它基本上是一个显示节点的TreeView,这些节点是Linq到Sql生成的类ICTemplates.Segment的实例。在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;我向段类添加了一个名为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;
}
}其馀部分是数据绑定,加上数据模板,将每个段显示为一组UI控件。
我非常肯定,孩子是按需加载的(当我展开家长)的响应时间。当我展开一个具有70子节点的节点时,需要一段时间才能加载子节点(任务管理器将Mem使用率显示为1000000 K!)。如果我扩展下一个节点,大约有50个孩子,砰!OutOfMemoryException
我运行VS Profiler以深入挖掘,这是结果
摘要页 对象寿命 分配
前三名是Action、DeferredSourceFactory.DeferredSource和EntitySet (所有.Net/LINQ类)。唯一的用户类是Segment[],段在#9和#10。
我想不出有什么线索..。可能是什么原因?
发布于 2009-01-09 10:51:48
问题似乎是创建多个S1DataContext对象(作为Sirocco )的问题。我尝试使用using语句来强制Dispose并使其符合收集条件。然而,它导致了一个我无法理解的ObjectDisposedException。

Linq查询使用tblSegments,它从S1DataContext的本地实例中检索。
无论如何,我假设有一些东西可以阻止创建和处理多个DataContexts。所以,,我尝试了一种单例DataContext。
而且起作用了!
除非显式地释放OR生成的System.Data.Linq.DataContext (吃掉内存),否则它似乎不会消失。试图在我的案件中处理它,没有成功..。尽管这两个函数都有自己的使用块(没有DataContext的共享实例)。虽然我不喜欢单身汉,但我正在为开发人员制作一个小型的内部工具,因此从现在开始我并不介意。我在网上看到的LinqToSql样本都没有..。有处理电话的命令。
所以我想问题已经解决了。感谢所有的人,他们扮演了更多的眼球,使这只虫子浅薄。
发布于 2009-01-09 07:40:42
也许是DataContext周围的一个用途?
using(System1ConfigDataContext dc = new System1ConfigDataContext()){
.... ?
}另外,你试过使用sql分析器吗?可能会对这件事有所启发。
发布于 2009-01-08 21:37:19
您试过对每个元素使用全局DataContext而不是一个吗?
创建所有DataContext的每个都有自己的查询和结果可能是内存膨胀的原因。
https://stackoverflow.com/questions/424016
复制相似问题