【问题标题】:Is it necessary to Dispose on Application_End if it's ending anyway?如果它仍然结束,是否有必要在 Application_End 上处理?
【发布时间】:2015-12-02 13:46:58
【问题描述】:

在 Web 或 Api 解决方案中处理诸如 Autofac 之类的 IOC 容器时,您会看到很多这样的实现代码:

protected void Application_Start()
{
    ///etc..
    this.container = builder.Build();//returns IDisposable instance
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    //etc..
}

protected void Application_End()
{
    container.Dispose();
}

看到在 Application_End 上容器被显式处理。

很好,但这真的有必要吗?

  • 我们不是在谈论即将结束的 Web 应用程序吗? 案子?
  • 当然,这意味着将为 ALL 调用 Dispose 未处置的物体仍在四处乱窜?
  • 有什么正当理由吗 或者以这种方式显式调用 dispose 有什么好处?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-web-api autofac


    【解决方案1】:

    很好,但这真的有必要吗?

    是的,这是最佳做法。完成后释放所有 IDisposable 实例。

    我们不是在谈论一个即将以任何方式结束的 Web 应用程序吗? 案子? 当然,这意味着将调用 Dispose 来处理所有仍在乱跑的未处理对象? 以这种方式显式调用 dispose 是否有任何正当理由或好处?

    优点是,Disposing 将抑制终结(如果您的容器已实现终结)。因此,垃圾收集器会尽快处理它,因为它不必进入终结队列。

    注意:

    还要注意,当您处理 Autofac LifetimeScope 时,它将为所有 IDisposable 实例执行 Dispose。例如,如果您使用 Autofac 创建了 container,并且您在完成后处置 Autofac 的 LifeTimeScope,则您可能不必手动处置 container

    【讨论】:

    • .NET 将在应用程序结束时为未处理的对象运行所有终结器,因此不需要处理这些实例来进行正确的终结。
    猜你喜欢
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多