一尘不染

捕获控制台出口C#

c#

我有一个包含很多线程的控制台应用程序。有一些线程监视某些条件,并在满足条件时终止程序。此终止可以随时发生。

我需要一个可以在程序关闭时触发的事件,以便可以清理所有其他线程并正确关闭所有文件句柄和连接。我不确定.NET框架中是否已经内置了一个,所以我要问自己写的是什么。

我想知道是否发生以下事件:

MyConsoleProgram.OnExit += CleanupBeforeExit;

阅读 223

收藏
2020-05-19

共1个答案

一尘不染

我不确定在网络上的什么位置找到代码,但是现在我在一个旧项目中找到了它。这将使您可以在控制台中执行清理代码,例如,突然关闭或由于关机而导致的代码…

[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*无法 很好地(或根本 无法)
工作。以下线程对此进行了讨论
*

2020-05-19