内存泄漏与linqpad和linq2sql

时间:2012-06-10 18:24:35

标签: .net linq-to-sql linqpad

我在linqpad中执行非常简单的代码。我不明白执行后我的记忆在哪里。它只是占用内存而不想退回。

  var step = 200000;
for (int i = 0; i < 1000; i++)
{
        //WordStats is linq2sql entity (dataContext.WordStats)  
    var keys = WordStats.Skip(step*i).Take(step).ToList();
    GC.Collect();
}

2 个答案:

答案 0 :(得分:2)

LINQ DataContext缓存DataContext中的所有读取对象,即使您自己没有对它们的任何引用。如果稍后查询对象,则会获得缓存版本。

不应该执行GC.Collect(),而应该清除LINQ上下文的缓存,here is a blogpost描述如何。

简而言之:

const BindingFlags FLAGS = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; 
var method = context.GetType().GetMethod("ClearCache", FLAGS); 
method.Invoke(context, null);

在LINQPad中,您应该将context替换为this

答案 1 :(得分:2)

另一种方法是告诉LINQ to SQL不要首先缓存对象:

this.ObjectTrackingEnabled = false;