如何在应用程序启动和关闭时自动调用静态类中的方法?

时间:2009-04-28 13:16:48

标签: .net multithreading logging static

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

要使日志工作,它需要先进行一些初始启动配置才能使用,并在每个应用程序完成时进行一些清理。

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

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

4 个答案:

答案 0 :(得分:3)

您可以使用类型初始化程序(例如静态构造函数)作为事物的启动方 - 当您第一次使用该类时,它将自动被调用。

检测关机比较困难......有AppDomain.ProcessExitAppDomain.DomainUnload哪些可能足够你...只需订阅事件并做出相应的反应。

答案 1 :(得分:2)

阅读单身人士,Jon Skeet有great article。使用此方法,您可以确保仅构造一次类型。当他谈到锁的性能时,看看最后。只是一些值得思考的东西。

答案 2 :(得分:1)

Singleton模式可能最适合您。静态_instance变量在start中初始化,因此调用其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);
  }
}

答案 3 :(得分:0)

一个单例模式,你不是每次都重新实例化Log类,而是使用getInstance()方法可以工作