我有一个包含很多线程的控制台应用程序。有一些线程监视某些条件,并在满足条件时终止程序。此终止可以随时发生。
我需要一个可以在程序关闭时触发的事件,以便可以清理所有其他线程并正确关闭所有文件句柄和连接。我不确定.NET框架中是否已经内置了一个,所以我要问自己写的是什么。
我想知道是否发生以下事件:
MyConsoleProgram.OnExit += CleanupBeforeExit;
我不确定在网络上的什么位置找到代码,但是现在我在一个旧项目中找到了它。这将使您可以在控制台中执行清理代码,例如,突然关闭或由于关机而导致的代码…
[DllImport("Kernel32")] private static extern bool SetConsoleCtrlHandler(EventHandler handler, bool add); private delegate bool EventHandler(CtrlType sig); static EventHandler _handler; enum CtrlType { CTRL_C_EVENT = 0, CTRL_BREAK_EVENT = 1, CTRL_CLOSE_EVENT = 2, CTRL_LOGOFF_EVENT = 5, CTRL_SHUTDOWN_EVENT = 6 } private static bool Handler(CtrlType sig) { switch (sig) { case CtrlType.CTRL_C_EVENT: case CtrlType.CTRL_LOGOFF_EVENT: case CtrlType.CTRL_SHUTDOWN_EVENT: case CtrlType.CTRL_CLOSE_EVENT: default: return false; } } static void Main(string[] args) { // Some biolerplate to react to close window event _handler += new EventHandler(Handler); SetConsoleCtrlHandler(_handler, true); ... }
更新资料
对于那些不检查注释的人,似乎该特定解决方案在 Windows 7* 上 无法 很好地(或根本 无法) 工作。以下线程对此进行了讨论 *