当前位置:  开发笔记 > 编程语言 > 正文

如何使用LINQ-To-SQL避免内存泄漏?

如何解决《如何使用LINQ-To-SQL避免内存泄漏?》经验,为你挑选了3个好方法。

我一直在使用LINQ-To-SQL来解决内存使用问题.我在Windows服务中使用它来进行一些处理,我正在循环遍历大量数据,我正在从上下文中撤回.是的 - 我知道我可以通过存储过程来做到这一点,但有理由说这不是理想的解决方案.

无论如何,我所看到的基本上是内存即使在我打电话后也没有被释放context.SubmitChanges().所以我最终不得不做各种各样奇怪的事情,比如只追回100条记录,或创建几个上下文并让它们都做单独的任务.如果我保持不变DataContext并稍后将其用于其他调用,它只会占用越来越多的内存.即使我调用查询返回给我Clear()的" var tableRows"数组,将其设置为null,并调用SYstem.GC.Collect()- 它仍然不会释放内存.

现在我已经阅读了一些关于如何DataContexts快速使用并快速处理它们的内容,但似乎它们应该是强制上下文转储所有数据(或特定表的所有跟踪数据)的方法.某一点保证内存是免费的.

有人知道哪些步骤可以保证释放内存?



1> Amy B..:

DataContext跟踪它所获取的所有对象.在收集垃圾之前不会释放它.此外,在实现时IDisposable,您必须调用Dispose或使用该using语句.

这是正确的方法:

using(DataContext myDC = new DataContext)
{
  //  Do stuff
} //DataContext is disposed



2> Mark Cidade..:

如果不需要对象跟踪,请将DataContext.ObjectTrackingEnabled设置为false.如果确实需要它,可以使用反射来调用内部DataContext.ClearCache(),尽管你必须知道,因为它的内部,它在框架的未来版本中会消失.据我所知,框架本身并没有使用它,但它确实清除了对象缓存.


以下是调用ClearCache()的方法:context.GetType().InvokeMember("ClearCache",BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,null,context,null);

3> Stefan Rusek..:

正如David指出的那样,您应该使用using块处理DataContext.

您的主要关注点似乎是创建和处理一堆DataContext对象.这就是linq2sql的设计方式.DataContext意味着具有较短的生命周期.由于您从数据库中提取了大量数据,因此有大量内存使用是有意义的.通过以块为单位处理数据,您处于正确的轨道上.

不要害怕创建大量的DataContexts.它们被设计成以这种方式使用.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有