首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的WPF绑定到LinqToSql类是内存占优势?

为什么我的WPF绑定到LinqToSql类是内存占优势?
EN

Stack Overflow用户
提问于 2009-01-08 11:57:08
回答 4查看 922关注 0票数 0

我有一个WPF应用程序,它在内存耗尽后停止运行.

它基本上是一个显示节点的TreeView,这些节点是Linq到Sql生成的类ICTemplates.Segment的实例。在OR设计器中,大约有20个表通过关联间接链接到该类。

代码语言:javascript
复制
<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的显式属性,该属性查找另一个具有父-子记录的表。

代码语言:javascript
复制
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。

我想不出有什么线索..。可能是什么原因?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-01-09 10:51:48

问题似乎是创建多个S1DataContext对象(作为Sirocco )的问题。我尝试使用using语句来强制Dispose并使其符合收集条件。然而,它导致了一个我无法理解的ObjectDisposedException。

  1. 该控件来自设置DockPanel KeeperOfAllControls的数据上下文的行。
  2. 外部代码
  3. Segment.Children.get (有一个带有dc的使用块)
  4. 回到第一步的线上..。

Linq查询使用tblSegments,它从S1DataContext的本地实例中检索。

无论如何,我假设有一些东西可以阻止创建和处理多个DataContexts。所以,,我尝试了一种单例DataContext

而且起作用了!

  • TreeView控件的响应更快,我尝试的每个节点都在3-4秒的最大值内加载.
  • 我在每次获取/搜索之前都输入了一个GC.Collect (用于验证),现在内存使用量保持在20万到30万K之间。

除非显式地释放OR生成的System.Data.Linq.DataContext (吃掉内存),否则它似乎不会消失。试图在我的案件中处理它,没有成功..。尽管这两个函数都有自己的使用块(没有DataContext的共享实例)。虽然我不喜欢单身汉,但我正在为开发人员制作一个小型的内部工具,因此从现在开始我并不介意。我在网上看到的LinqToSql样本都没有..。有处理电话的命令。

所以我想问题已经解决了。感谢所有的人,他们扮演了更多的眼球,使这只虫子浅薄。

票数 0
EN

Stack Overflow用户

发布于 2009-01-09 07:40:42

也许是DataContext周围的一个用途?

代码语言:javascript
复制
using(System1ConfigDataContext dc = new System1ConfigDataContext()){
  .... ?
}

另外,你试过使用sql分析器吗?可能会对这件事有所启发。

票数 1
EN

Stack Overflow用户

发布于 2009-01-08 21:37:19

您试过对每个元素使用全局DataContext而不是一个吗?

创建所有DataContext的每个都有自己的查询和结果可能是内存膨胀的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/424016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档