出于某种原因,我将 .NET 8 webapi 视为 Windows 上的应用程序,并使用独立的方法发布它并执行它。
但我想知道当用户通过Windows工具栏或窗口右上角的图标关闭程序时如何捕获事件。
目前我正在尝试使用
app.Lifetime.ApplicationStopping
,但似乎只能捕获控制台中按Ctrl+C
触发的终止,无法检测到点击图标或窗口右上角触发的关闭。
事实上,我的最终目标是在特定服务结束时执行一些操作。这是另一个 .NET 8 DLL,但它的析构函数似乎也没有被触发。
所以如果有更好的方法来实现这一点,请提出。谢谢。
更新:
当我使用
AppDomain.CurrentDomain.ProcessExit
时,我可以抓住它。然而,此时该对象已变为 null,难以操作。
您可以查看此snippet,但最好使用Windows服务并检测
StopAsync
class Program
{
// https://learn.microsoft.com/en-us/windows/console/setconsolectrlhandler?WT.mc_id=DT-MVP-5003978
[DllImport("Kernel32")]
private static extern bool SetConsoleCtrlHandler(SetConsoleCtrlEventHandler handler, bool add);
// https://learn.microsoft.com/en-us/windows/console/handlerroutine?WT.mc_id=DT-MVP-5003978
private delegate bool SetConsoleCtrlEventHandler(CtrlType sig);
private enum CtrlType
{
CTRL_C_EVENT = 0,
CTRL_BREAK_EVENT = 1,
CTRL_CLOSE_EVENT = 2,
CTRL_LOGOFF_EVENT = 5,
CTRL_SHUTDOWN_EVENT = 6
}
static void Main(string[] args)
{
// Register the handler
SetConsoleCtrlHandler(Handler, true);
// Wait for the event
while (true)
{
Thread.Sleep(50);
}
}
private static bool Handler(CtrlType signal)
{
switch (signal)
{
case CtrlType.CTRL_BREAK_EVENT:
case CtrlType.CTRL_C_EVENT:
case CtrlType.CTRL_LOGOFF_EVENT:
case CtrlType.CTRL_SHUTDOWN_EVENT:
case CtrlType.CTRL_CLOSE_EVENT:
Console.WriteLine("Closing");
// TODO Cleanup resources
Environment.Exit(0);
return false;
default:
return false;
}
}
}