C# 收到SIGTERM信号后,是否可以恢复中断的过程?

C# 收到SIGTERM信号后,是否可以恢复中断的过程?,c#,.net,event-handling,console-application,C#,.net,Event Handling,Console Application,在下面的程序中,我试图实现的是,当我按下Ctrl+C或给定SIGTERM时,我想将“isEnable”设为false,让while循环最后一次完成代码的执行并优雅地退出程序。 我只能用CancelKeyPress实现这一点,因为传递给这个处理程序的EventArgs具有Cancel属性,我只需要将其设置为true。而且,CancelKeyPress只处理Ctrl+C。但是,当我得到SIGTERM信号时,我想要同样的东西 有人知道在收到SIGTERM信号后是否可以像在CancelKeyPress中

在下面的程序中,我试图实现的是,当我按下Ctrl+C或给定SIGTERM时,我想将“isEnable”设为false,让while循环最后一次完成代码的执行并优雅地退出程序。 我只能用CancelKeyPress实现这一点,因为传递给这个处理程序的EventArgs具有Cancel属性,我只需要将其设置为true。而且,CancelKeyPress只处理Ctrl+C。但是,当我得到SIGTERM信号时,我想要同样的东西

有人知道在收到SIGTERM信号后是否可以像在CancelKeyPress中一样恢复该过程吗

如果你需要更多的信息来理解我的问题,请告诉我

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            bool isEnable = true;

            Console.CancelKeyPress += (s, e) =>
            {
                e.Cancel = true;
                isEnable = false; // making while loop false
                Console.WriteLine("Inside CancelKeyPress");
            };

            AppDomain.CurrentDomain.ProcessExit += (s, e) =>
            {
                isEnable = false;  // making while loop false
                Console.WriteLine("AppDomain ProcessExit!");
            };

            while (isEnable)
            {
                Console.WriteLine("first");
                Thread.Sleep(3000);
                Console.WriteLine("Second");
                Thread.Sleep(3000);
                Console.WriteLine("Third");
                Thread.Sleep(3000);
                Console.WriteLine("Fourth");
                Thread.Sleep(3000);
            }

            Console.WriteLine("Gracefull Shotdown");

        }
    }
SIGTERM是一种“礼貌”的方式,要求程序优雅地终止

然后,程序可以按其希望的任何方式处理此问题

  • 它可以忽略它
  • 它可以立即关闭
  • 它可以完成当前任务的处理,然后优雅地 关机(断开与数据库的连接,关闭文件等)
  • 它可以想等多久就等多久,然后关机
(如果在Kubernetes下运行,那么您可以配置K8s在发送SIGTERM和SIGKILL之间等待的时间。因此,如果您的应用程序需要10分钟才能关闭,那么您可以进行配置,这被认为是完全可以接受的。)

在上面的代码中,您不是在“恢复处理”,而是通过有效地忽略CTRL-C请求,选择在程序中捕获并处理这一点

因此,在其他平台上接收SIGTERM时,没有理由不能这样做

你可能会发现这篇文章很有帮助:

C#以Windows为中心,Windows没有SIGTERM等POSIX信号。Ctrl-C和Ctrl-Break的处理方式大致相似,但仅此而已。我想知道它在Linux主机上运行时是否支持信号+1@ikegami我用dotnetcore编写了这个应用程序,并在linux框中运行了代码,然后给出了“kill-15”。此时,它调用AppDomain.CurrentDomain.ProcessExit并终止应用程序,而不是继续以前的任务。Re“此时它调用AppDomain.CurrentDomain.ProcessExit并终止应用程序”,取消事件(
e.Cancel=true;
)是否会阻止退出?