为了账号安全,请及时绑定邮箱和手机立即绑定

如何在C#控制台应用程序中捕获ctrl-c(SIGINT)

如何在C#控制台应用程序中捕获ctrl-c(SIGINT)

慕田峪4524236 2019-12-10 09:39:48
我希望能够在C#控制台应用程序中捕获CTRL+ C,以便可以在退出前进行一些清理。最好的方法是什么?
查看完整描述

3 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

该Console.CancelKeyPress事件被用于此目的。使用方法如下:


public static void Main(string[] args)

{

    Console.CancelKeyPress += delegate {

        // call methods to clean up

    };


    while (true) {}

}

当用户按Ctrl + C时,将运行委托中的代码,并退出程序。这使您可以通过调用necessairy方法来执行清理。请注意,执行委托后没有任何代码。


在其他情况下,这也无法解决。例如,如果程序当前正在执行无法立即停止的重要计算。在这种情况下,正确的策略可能是在计算完成后告诉程序退出。以下代码给出了如何实现的示例:


class MainClass

{

    private static bool keepRunning = true;


    public static void Main(string[] args)

    {

        Console.CancelKeyPress += delegate(object sender, ConsoleCancelEventArgs e) {

            e.Cancel = true;

            MainClass.keepRunning = false;

        };


        while (MainClass.keepRunning) {

            // Do your work in here, in small chunks.

            // If you literally just want to wait until ctrl-c,

            // not doing anything, see the answer using set-reset events.

        }

        Console.WriteLine("exited gracefully");

    }

}

此代码与第一个示例之间的差异e.Cancel是设置为true,这意味着在委托之后继续执行。如果运行,程序将等待用户按Ctrl +C。在这种情况下,keepRunning变量会更改值,从而导致while循环退出。这是使程序正常退出的一种方式。


查看完整回答
反对 回复 2019-12-10
  • 3 回答
  • 0 关注
  • 1369 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信