gpt4 book ai didi

c# - 如何使控制台应用程序在关闭时优雅地退出

转载 作者:太空狗 更新时间:2023-10-29 21:39:26 28 4
gpt4 key购买 nike

我写了这个小程序来证明问题的重点:

using System;
using System.IO;
using System.Threading;

class Program
{
static void Main(string[] args)
{
using (var disp = new MyDisp())
{
using (var ewhLocalExit = new EventWaitHandle(false, EventResetMode.ManualReset))
{
Console.WriteLine("Enter Ctrl+C to terminate the app.");
Console.CancelKeyPress += (_, e) =>
{
e.Cancel = true;
ewhLocalExit.Set();
};
ewhLocalExit.WaitOne();
}
}
File.AppendAllText("Log.txt", "Terminated.\n");
}
}


class MyDisp : IDisposable
{
public MyDisp()
{
File.AppendAllText("Log.txt", "Started.\n");
}

public void Dispose()
{
File.AppendAllText("Log.txt", "Disposed.\n");
}
}

当我运行它并按 Ctrl+C 时,我看到“Started.Disposed.Terminated”。在日志.txt
当我运行它并用鼠标关闭它时,我只看到“已启动”。

我如何优雅地退出,这样我至少可以看到“Disposed”。 ?

最佳答案

您可以使用 DLLImport 导入 SetConsoleControlHandler 并使用它为已关闭事件(和其他事件)注册一个事件处理程序,这是一个示例片段,显示它正在工作(当您单击 X 时,它将在 Log.txt 中写入关闭关闭控制台):

class Program
{
[DllImport("Kernel32")]
public static extern bool SetConsoleCtrlHandler(HandlerRoutine Handler, bool Add);

// A delegate type to be used as the handler routine
// for SetConsoleCtrlHandler.
public delegate bool HandlerRoutine(CtrlTypes CtrlType);

// An enumerated type for the control messages
// sent to the handler routine.
public enum CtrlTypes
{
CTRL_C_EVENT = 0,
CTRL_BREAK_EVENT,
CTRL_CLOSE_EVENT,
CTRL_LOGOFF_EVENT = 5,
CTRL_SHUTDOWN_EVENT
}

private static bool ConsoleCtrlCheck(CtrlTypes ctrlType)
{
if (ctrlType == CtrlTypes.CTRL_CLOSE_EVENT)
File.AppendAllText(@"Log.txt", "closed");

return true;
}

private static void Main(string[] args)
{
SetConsoleCtrlHandler(new HandlerRoutine(ConsoleCtrlCheck), true);
Console.WriteLine("Close me");
Console.ReadLine();
}
}

Source

关于c# - 如何使控制台应用程序在关闭时优雅地退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21751545/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com