c# - .Net Core 2 中 GC 如何与 DI 一起工作

标签 c# .net asp.net-core garbage-collection .net-core

通常在使用 Entity Framework 时我会使用“using”子句:

using (var db = new dbcontext())
{
    var blabla = db.table.tolist();
}

现在,我们已将我们的平台迁移到 .Net Core (2),并且由于有一个很棒的 DI 机制,我们决定使用它。现在,我们不再使用上述方式,而是将 dbcontext 作为构造函数中的参数:

public MeaningfullNameController(dbcontext db)
{
    this.db = db;
}

而当另一个类需要使用dbcontext时,我们只需在第二个类的构造函数中传递上面的dbcontext。

public class NewClass(dbcontext db)
{
    this.db = db;
}

这种情况让我开始思考,垃圾收集器如何处理这种情况? 在性能方面与第一种方法有区别吗?内存泄漏?等等

谢谢, 沙乌尔

最佳答案

在生命周期方面肯定存在差异。

在第一种方法中,您通过new 创建对象(并分配内存和它需要的任何其他资源)。 using block 的末尾将对其调用 Dispose,释放任何非内存资源。当对象超出范围时,GC 可以看到它没有被使用并随时回收它。

在 DI 方法中,生命周期由 DI 框架管理。 DI 框架将分配它并 Dispose 它。 DI 框架可以在应用程序的整个生命周期内为其分配一次,每次调用 DI 支持方法或介于两者之间的任何时间。因此,生命周期可能更长并且可能长得多。如果对象存活时间更长,则意味着 .NET Core 运行时系统分配和回收它的频率较低。它做的工作更少。但这意味着对象资源的使用时间更长:与数据库的连接和任何句柄都将保留更长时间。如果您不只使用数据库一次,例如,在应用程序的生命周期内,并且在整个生命周期内都保持事件状态,那么您只是在浪费不需要的资源。

换句话说,没有一个简单的答案。对于经常使用的资源,与显式调用 new + Dispose 相比,使用具有每次方法调用生命周期的 DI 将涉及类似的工作量。对于其他类型的用途,这将取决于您在做什么以及什么对您的用例“更好”。

但总的来说,这不是您应该尝试优化的内容,除非您知道这会导致性能问题。首先为开发人员优化。

关于c# - .Net Core 2 中 GC 如何与 DI 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47313005/

相关文章:

c# - 如何在没有 jQuery 的情况下模拟 ajaxStart 和 ajaxStop?

c# - 运行没有 .exe 扩展名的外部应用程序

c# - ASP.NET Core 2.0 如何在自定义验证属性中进行客户端验证?

c# - 如何在 Windows 窗体 C# 中为文本框设置 Scintilla

c# - Microsoft.ReportViewer.WinForms.V15 与 .NET Core 3.1 不兼容 - 如何在 WPF Core 中显示 RDLC?

c# - 将子列表转换为父类型列表

c# - 签名验证失败。无法匹配 'kid'

asp.net-core - 返回404页面,无需重定向

c# - 是否可以用多个 Http 属性装饰 ASP.NET WEB API Controller 方法

c# - 程序 '[12460] TestProject.exe' 已退出,代码为 -1 (0xffffffff)