【问题标题】:Do class finalizers execute when IIS pool recycled/stoppedIIS 池回收/停止时是否执行类终结器
【发布时间】:2020-12-04 14:56:20
【问题描述】:

是否在 IIS 池回收时执行类终结器,或者在池 STOP 期间执行此操作。从理论上讲,这应该类似于Application.Run/Stop,但是是吗?

在相同的上下文中,我相信,如果应用程序是 NET CORE,并且它在 Kestrel 或 IIS 中运行控制台应用程序,那么关闭控制台应用程序将运行终结器。还是这样?

【问题讨论】:

  • 终结器在垃圾回收时运行。即使您在进程终止之前收集了垃圾(这是不正常的),这并不意味着所有东西都被收集了。你想做什么?如果您试图检测关闭以进行必要的处理,那么:不要通过终结器来执行此操作。事实上,终结器非常很少见,您可能不应该使用它们。
  • @MarcGravell 我记得,如果你正常关闭 Windows 应用程序,终结器就会运行。看起来在那段时间里有最后一个 GS 在运行。是的。所以,基本上,需要释放一些远程资源。
  • 那么 IMO 你问错了问题;真正的问题是“如何检测 asp.net 关闭”(也许分别在 IIS 和 Kestrel 的上下文中)。我现在面前没有电脑,因为我们一直这样做
  • @MarcGravell 也许......但在我看来,这仍然是一个有趣的问题。要知道的事情。

标签: asp.net .net asp.net-core iis .net-core


【解决方案1】:

要在 ASP.NET Core 中检测应用程序关闭,您可以在 Configure 方法中添加一个事件。

下面是strtup类的列表:

1)IApplicationBuilder

2)IHostingEnvironment

3)ILoggerFactory

4)IApplicationLifetime

public class Startup
{
    public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime)
    {
        applicationLifetime.ApplicationStopping.Register(OnShutdown);
    }
 
    private void OnShutdown()
    {
         //this code is called when the application stops
    }
}

https://gist.github.com/davidfowl/4015810

【讨论】:

  • 感谢您的意见。这很有趣,但是,您的答案并不能直接回答问题,在这种情况下,它仅适用于“核心”事物,而不适用于例如旧式 asp.net WSP。问题再次主要是,在 IIS 应用程序池关闭期间是否存在某种机制,即某些 IIS 组件/处理程序调用 GC 来收集并执行终结器。如果其中一些恰好有代码,则此代码会在池最终关闭之前执行。
  • 我想说,在这一点上,这更像是一种学术兴趣
  • @T.S. os有助于释放内存,而不是GC你可以参考这个链接:stackoverflow.com/questions/31793305/…
  • 这与我正在讨论的内容密切相关。不是你在说什么stackoverflow.com/questions/15246167/…
猜你喜欢
  • 2011-03-10
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多