4

我在 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();
}
4

2 回答 2

4

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

this.ObjectTrackingEnabled = false;
于 2012-06-11T02:20:22.433 回答
2

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

GC.Collect()您应该清除 LINQ 上下文的缓存,而不是这样做,这是一篇描述如何进行的博文。

简而言之:

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

在 LINQPad 中,您应该替换contextthis.

于 2012-06-10T18:47:37.620 回答