1. ホーム
  2. c#

[解決済み] コンソール終了のキャプチャ C#

2023-01-17 01:13:30

質問

非常に多くのスレッドを含むコンソールアプリケーションを持っています。 ある条件を監視し、それが真であればプログラムを終了させるスレッドがあります。 この終了はいつでも起こる可能性があります。

他のすべてのスレッドをクリーンアップし、すべてのファイル ハンドルと接続を適切に閉じることができるように、プログラムが終了するときにトリガーされるイベントが必要です。 .NET フレームワークにすでに組み込まれているものがあるかどうか分からないので、自分で書く前に質問しています。

という行に沿ったイベントがあるかどうか疑問に思っていました。

MyConsoleProgram.OnExit += CleanupBeforeExit;

どのように解決するのですか?

私はウェブ上のどこでコードを見つけたかわからないが、私は今、私の古いプロジェクトの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 . 以下は スレッド は、このことについて話しています。