如何在 dotnet 8 webapi 中捕获程序关闭?

问题描述 投票:0回答:1

出于某种原因,我将 .NET 8 webapi 视为 Windows 上的应用程序,并使用独立的方法发布它并执行它。

但我想知道当用户通过Windows工具栏或窗口右上角的图标关闭程序时如何捕获事件。

目前我正在尝试使用

app.Lifetime.ApplicationStopping
,但似乎只能捕获控制台中按
Ctrl+C
触发的终止,无法检测到点击图标或窗口右上角触发的关闭。

事实上,我的最终目标是在特定服务结束时执行一些操作。这是另一个 .NET 8 DLL,但它的析构函数似乎也没有被触发。

所以如果有更好的方法来实现这一点,请提出。谢谢。

更新:

当我使用

AppDomain.CurrentDomain.ProcessExit
时,我可以抓住它。然而,此时该对象已变为 null,难以操作。

c# asp.net-core-webapi .net-8.0
1个回答
0
投票

您可以查看此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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.