C# 为什么EF Core 2.2.6不进行垃圾收集?

C# 为什么EF Core 2.2.6不进行垃圾收集?,c#,garbage-collection,entity-framework-core,dotmemory,C#,Garbage Collection,Entity Framework Core,Dotmemory,我使用dotMemoryUnit来证明my DbContext对象正在正确地进行垃圾收集 我觉得这段代码应该在单元测试中正常工作,但测试总是失败。我能猜到的唯一一件事是EF Core在某处持有一个引用 编辑:我不确定建议的解决方案是否解决了这个问题,因为这是.Net核心而不是.Net框架。GC.Collect()默认值的文档是强制的,文档中没有任何提示 编辑2:我确实找到了下面的答案 想法 公共类UnitTest1 { 公共单元测试1(ITestOutputHelper输出) { dotMemo

我使用dotMemoryUnit来证明my DbContext对象正在正确地进行垃圾收集

我觉得这段代码应该在单元测试中正常工作,但测试总是失败。我能猜到的唯一一件事是EF Core在某处持有一个引用

编辑:我不确定建议的解决方案是否解决了这个问题,因为这是.Net核心而不是.Net框架。GC.Collect()默认值的文档是强制的,文档中没有任何提示

编辑2:我确实找到了下面的答案

想法

公共类UnitTest1
{
公共单元测试1(ITestOutputHelper输出)
{
dotMemoryUnitsToOutput.SetOutputMethod(output.WriteLine);
}
[事实]
[dotmoryunit(FailIfRunWithoutSupport=false)]
public void DummyContext_disposesContextExportangarbageCollect()
{
//安排
var options=new DbContextOptionsBuilder()
.UseSqlServer(“数据源=ASqlServer;集成安全性=true”);
使用(var ctx=new DummyContext(options.options))
{
//无所事事
}
GC.Collect();
GC.WaitForPendingFinalizers();
点内存,检查(
内存=>
坚持平等(
0,
memory.GetObjects(where=>where.Type.Is()).ObjectsCount);
}
私有类DummyContext:DbContext
{
公共DummyContext(DbContextOptions选项)
:基本(选项)
{
}
}
}

经过进一步的研究,我从Jet Brains中找到了答案:

因为我们所有的逻辑都在一个方法(我们的测试方法)中运行,所以垃圾收集器不会清理在我们的函数上下文中仍然可用的局部变量

这篇文章建议将代码包装成一个动作方法

对于可能存在此问题的其他人,以下是我的新测试方法:

[事实]
[dotmoryunit(FailIfRunWithoutSupport=false)]
public void DummyContext_disposesContextExportangarbageCollect()
{
var隔离器=新动作(
() =>
{
//安排
var options=new DbContextOptionsBuilder()
.UseSqlServer(“数据源=ASqlServer;集成安全性=true”);
使用(var ctx=new DummyContext(options.options))
{
//无所事事
}
});
隔离器();
GC.Collect();
GC.WaitForPendingFinalizers();
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle,-1,-1);
点内存,检查(
内存=>
坚持平等(
0,
memory.GetObjects(where=>where.Type.Is()).ObjectsCount);
}

只是为了确保,在创建新上下文之前进行检查时,计数为0?重复@HansKesting-是值为零
GC.Collect()更多的是一个提示或建议,而不是一个命令。如果GC认为没有必要收集,它可以耸耸肩作出响应。