【问题标题】:How to automatically call a method in a static class on application start up and close down?如何在应用程序启动和关闭时自动调用静态类中的方法?
【发布时间】:2010-10-22 07:46:41
【问题描述】:

我正在编写一个用于日志记录的静态类,以便在我开发的解决方案中使用。有几个组件将使用它,例如控制台应用程序、ASP.NET 应用程序等......

为了使日志记录工作,它需要在使用之前进行一些初始启动配置,并在每个应用程序完成后进行一些清理。

有没有办法在 .NET 中执行此操作,而无需从解决方案中的每个应用程序显式调用 StartLog() 和 FinishLog() 方法?或者也许是另一种看待这个问题的完全不同的方式?

我一直在考虑在每个 Log() 方法中使用锁来检查日志记录类是否已被初始化,但是在性能和​​复杂性方面的潜在开销让我感到害怕。

【问题讨论】:

    标签: .net multithreading logging static


    【解决方案1】:

    您可以使用类型初始化器(例如静态构造器)来启动事物 - 当您第一次使用该类时会自动调用它。

    检测关机更难...有AppDomain.ProcessExitAppDomain.DomainUnload 可能对您来说已经足够...只需订阅事件并做出相应反应。

    【讨论】:

    • 这仍然需要他调用 StartLog() (即首先使用他的类)。我认为没有办法解决这个问题,只是认为让它更明确可能会更好。
    • 我正在考虑一个静态构造函数以及它的等效析构函数:AppDomain.DomainUnload。然而,MSDN 声明在默认应用程序域中永远不会引发 DomainUnload 事件,因此这似乎不是一个选项。
    • 这就是为什么我建议你也看看 ProcessExit :)
    【解决方案2】:

    阅读单身人士,Jon Skeet 有一个great article。使用它可以确保类型只构造一次。当他谈到锁的性能时,看看最后。只是一些思考的食物。

    【讨论】:

      【解决方案3】:

      Singleton 模式可能最适合您。静态 _instance 变量在开始时被初始化,因此它的 Log() 构造函数被调用,您可以在此处进行初始化。由于它实现了IDisposable 并覆盖了 Finalize,它将具有 Dispose() 方法,该方法将在应用程序退出并释放静态实例变量时调用。

      public class Log : IDisposable {
        private Log() {
          // Initialize logic
        }
      
        public LogMessage(string wah) {
          // Write
        }
      
        public void Dispose() {
          // Clean up
        }
      
        public override void Finalize() {
          Dispose();
        }
      
        private static Log _instance = new Log();
        public static Log Instance { get { return _instance; } }
      
        // You can also implement helper methods on static level if you want to keep the usage same.
        public static Message(string wah) {
          _instance.LogMessage(wah);
        }
      }
      

      【讨论】:

      • 您似乎暗示在进程退出时会自动调用 Dispose。事实并非如此。
      • 哦。你让我到了那里。将其与 Finalize 混合。
      【解决方案4】:

      单例模式,您不必每次都重新实例化 Log 类,而是使用 getInstance() 方法会起作用

      【讨论】:

        猜你喜欢
        • 2019-05-28
        • 2019-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-22
        • 2012-11-25
        • 2023-03-16
        相关资源
        最近更新 更多