【发布时间】:2021-04-09 03:04:05
【问题描述】:
在下面的程序中,我想要实现的是当我按下 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");
}
}
【问题讨论】:
-
C# 以 Windows 为中心,Windows 没有 SIGTERM 等 POSIX 信号。 Ctrl-C 和 Ctrl-Break 的处理方式大致相似,但仅此而已。我想知道它在 Linux 主机上运行时是否支持信号。 +1
-
@ikegami 我在 dotnet core 中编写了这个应用程序,并在 linux 框中运行了代码,然后给出了“kill -15
”。那时它调用 AppDomain.CurrentDomain.ProcessExit 并终止应用程序而不是恢复之前的任务。 -
Re "当时它调用了 AppDomain.CurrentDomain.ProcessExit 并终止了应用程序",取消事件(
e.Cancel = true;)不会阻止退出吗?
标签: c# .net event-handling console-application