【问题标题】:How to initialize and de-initialize only one time during application life cycle in ASP.NET MVC如何在 ASP.NET MVC 中的应用程序生命周期中只初始化和反初始化一次
【发布时间】:2020-09-28 15:11:02
【问题描述】:

我有一个静态类,我需要在第一次使用的类期间初始化一些代码,并在应用程序进程终止时进行初始化。实际上,init 方法使用 PInvoke 方法调用本机 C++ api。我知道我可以使用静态构造函数,但现在我需要在最后调用本机 de-init 方法,

public static class MyClass
{
    static MyClass()
    {
        MyInitFirstTime();
    }        

【问题讨论】:

  • 或许您可以使用 Global.asax 文件中的应用程序生命周期link
  • 你对static构造函数没有任何控制权... .这个问题可能是XY problem
  • @HoomanBahreini 需要在应用程序启动和应用程序完成时调用本机函数,换句话说,在创建进程和退出进程时。

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


【解决方案1】:

您可以将 Application_Start 和 Application_End “特殊方法”用作 documented by Microsoft,而不是静态类。

Application_Start 和 Application_End 方法是特殊方法 不代表 HttpApplication 事件。 ASP.NET 调用它们一次 对于应用程序域的生命周期,而不是每个 HttpApplication 实例。

另一个选项是覆盖HttpApplication.Dispose methodDisposed event。如果您决定覆盖 Dispose(),请不要忘记调用基类 Dispose() 方法。

【讨论】:

    【解决方案2】:

    静态类没有任何本地方法,但您可以使用 AppDomain DomainUnload 事件代替:

    public static class MyClass
    {
        static MyClass()
        {
            AppDomain.CreateDomain("dummy").DomainUnload += CurrentDomain_DomainUnload;
    
            MyInitFirstTime();
        }
    
        private static void CurrentDomain_DomainUnload(object sender, EventArgs e)
        {
            // Free resources
        }
    }
    

    【讨论】:

    • 我也找到了 ProcessExit 函数,那么哪个更准确呢?
    • @user960567 :绝对是DomainUnload。与DomainUnload 不同,ProcessExit 事件是定时的!意味着 CLR 在终止应用程序之前让每个 appdomain 2 秒运行 ProcessExit 处理程序
    • @user960567:对!但重点仍然存在。 ProcessExit 是定时的,不能保证在应用程序终止之前完成! (答案已更新以涵盖您指出的问题。不是最好的,但至少有效)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2015-03-22
    • 2018-06-06
    • 2021-07-14
    • 2016-06-28
    • 2012-11-23
    • 2021-12-12
    相关资源
    最近更新 更多