【问题标题】:How to dispose resources declared in static class in an ASP.NET web application如何在 ASP.NET Web 应用程序中处理静态类中声明的资源
【发布时间】:2015-09-28 21:32:12
【问题描述】:

我在 ASP.NET MVC 应用程序中引用了第 3 方库,因为库的设计,它需要一个类(比如 ClassA),它必须只实例化一次,并且应该在使用后处理掉。因此,在我的 MVC 应用程序中,我定义了一个静态类并在内部实例化了外部 ClassAClassA 被大量使用)。但是处理ClassA 的单个实例的有效方法是什么?我相信Application_End 不是正确的地方。但在什么情况下或方法是正确的?

我应该考虑iisreset、应用程序池回收和服务器停止或重新启动的任何其他情况,并确保资源得到正确处置。

【问题讨论】:

  • 需要处理的资源是什么?如果流程结束,您确定还需要做其他事情吗?您将如何应对(例如)停电?
  • 确定吗?这些本机资源是否会在进程终止时被终止,例如网络连接、Win32 对象等?再说一遍——如果停电,你就没有机会处理这些资源了,会发生什么?
  • @JonSkeet,同意我不能处理所有情况(例如停电),但我想尽力处理所有可以处理的情况。我希望所有的原生资源都会被操作系统自动杀死。但是,在IIS应用程序池回收等情况下,进程并没有终止,而是所有的请求和响应都被搁置了,不确定这是不是资源没有被释放的问题。
  • 如果 AppDomain 消失,其中的所有对象都可以被垃圾回收。如果库已正确编写(使用 SafeHandle 或终结器等),应该全部正确收集。您可以使用 AppDomain.DomainUnload,但听起来并不理想。也许你应该问制作图书馆的第三方?基本上,“需要处理的单身人士”是一种非常非常丑陋的模式。
  • 你可以试试这样的:stackoverflow.com/a/13258842/2649492

标签: c# asp.net .net asp.net-mvc


【解决方案1】:

我的建议。首先为 ClassA 创建一个私有字段。将其封装到一个属性中,该属性检查该字段是否为空。如果为 null 创建一个新实例。如果不是,则释放该对象并返回 ClassA 的新实例。有意义吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 2013-12-09
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多