gpt4 book ai didi

c# - ObjectContext 正在泄漏分离实体的内存

转载 作者:太空狗 更新时间:2023-10-29 19:47:24 29 4
gpt4 key购买 nike

我已经使用内存分析器对此进行了检查,没有真正的实体保留在内存中但是哈希集、字典和 EntityKey 对象——但我找不到如何断开这些引用的方法。

如此简单的问题:如何阻止上下文(或其 ObjectStateManager)的大小无限增长

[是的,我知道应该避免长期存在的上下文,但在这种情况下,这是一个复杂的分析运行,需要加载多个分层数据(下面的示例只是一个最小的问题演示)所以最后它是一个“短”活的单操作上下文。]

重现步骤:

  • 创建一个新的控制台应用程序
  • 为 Northwind 数据库创建一个 EF 模型(使用一些真正的 SQL Server 或从 Compact Samples 文件夹复制 Northwind.sdf)
  • 使用下面的代码:

代码[已更新,不再需要真正的数据库连接]:

class Program
{
static void Main()
{
const double MiB = 1024 * 1024;
using ( var context = new NorthwindEntities() )
{
var last = GC.GetTotalMemory(true) / MiB;
Console.WriteLine("before run: {0:n3} MiB", last);
var id = 0;
while ( true )
{
Run(context, ref id);

GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
var current = GC.GetTotalMemory(true) / MiB;
Console.WriteLine("after run: {0:n3} MiB (+{1:n3} MiB)", current, current - last);
last = current;

if ( Console.KeyAvailable )
break;
Console.WriteLine(new string('-', 100));
}
}
}

static void Run(NorthwindEntities context, ref int id)
{
for ( int i = 0; i < 100000; i++ )
{
var category = new Category { Category_ID = ++id };
category.EntityKey = new EntityKey("NorthwindEntities.Categories", "Category_ID", id);
var product = new Product { Product_ID = id, Category_ID = id };
product.EntityKey = new EntityKey("NorthwindEntities.Products", "Product_ID", id);
product.Category = category;
context.Attach(product);
context.Detach(product);
context.Detach(category);
}

var ctr = 0;
Console.WriteLine("Enumerating living/attached objects:");
const EntityState AllStates = EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged;
foreach ( var entry in context.ObjectStateManager.GetObjectStateEntries(AllStates) )
Console.WriteLine(" #{0} [{1}] {2}", ++ctr, entry.EntityKey, entry.Entity);
if ( ctr == 0 )
Console.WriteLine(" NOTHING (as expected)");
}
}

最佳答案

因为我只是在调用 SaveChanges() 后直接分离实体,所以我现在计算分离实体的数量,当计数器达到 10,000 时,我从上下文中分离所有仍然存在的(和需要的)对象并创建一个我附加所有分离对象的新上下文。缺点:EntityReferences 和 EntityCollections 的 IsLoaded 属性现在始终为 false(但我不依赖于此)。

关于c# - ObjectContext 正在泄漏分离实体的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7629336/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com