在应用程序终止(Ctrl+C)之后运行一段代码

本文关键字:一段 代码 运行 之后 应用程序 Ctrl+C 终止 | 更新日期: 2023-09-27 18:18:46

在我的程序中,我在循环的每次迭代中接近文本文件,以避免运行时丢失任何数据。这是残酷的无效,而且我昨天仍然丢失了数据。

我有两个队列-"我做了什么"answers"做什么"。一段时间后,我需要结束这个应用程序,并记住这些队列为下一个应用程序运行。我通常使用Ctrl+ c终止应用程序。

有没有办法运行保存这些队列文件后,应用程序杀死?或者如何以用户身份正确结束控制台应用程序。

是否有可能自动运行一段代码?我的意思是,当我通过删除第一行来更新一些"队列文件"时,我需要将整个文件复制到tmp,而不是删除原始文件,然后将tmp文件复制到原始文件。但有时我在开始后马上按Ctrl+C。文件删除,我丢失了一个队列

在应用程序终止(Ctrl+C)之后运行一段代码

Ctrl+C并不一定会终止应用程序—您可以使用Console.CancelKeyPress事件来正确地处理关闭。至于当用户点击关闭按钮时,你就倒霉了——这实际上残酷地扼杀了这个过程。

您的应用程序应该支持安全关闭。例如,您可以有一个在Console.CancelKeyPress中发出信号的取消令牌,并且您的代码应该偶尔检查令牌(当您处于安全终止的位置时),以查看是否请求了关机。

作为额外的措施,您可以尝试使用一些更安全的操作措施。例如,与其删除原始文件,还不如重命名它。如果您的处理在中间失败,文件仍然存在,您可以在重新启动应用程序时恢复它。只有当一个新文件被完全处理和复制后,你才会删除原来的文件。

有没有办法运行保存这些队列文件后,应用程序杀死?

。必须执行退出命令。

看起来您可以钩住CTRL-C或CTRL-BREAK信号,以便优雅地退出应用程序。

class Program
{
    //https://msdn.microsoft.com/en-us/library/windows/desktop/ms683231(v=vs.85).aspx
    private const int STD_INPUT_HANDLE = -10;
    private const uint ENABLE_PROCESSED_INPUT = 0x0001;

    [DllImport("Kernel32.dll")]
    private static extern IntPtr GetStdHandle(int nStdHandle);
    [DllImport("Kernel32.dll")]
    private static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);
    [DllImport("Kernel32.dll")]
    private static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint dwMode);
    static void Main(string[] args)
    {
        IntPtr handle = GetStdHandle(STD_INPUT_HANDLE);
        uint mode;
        GetConsoleMode(handle, out mode);
        mode &= ~ENABLE_PROCESSED_INPUT;
        SetConsoleMode(handle, mode);
        new Thread(() =>
        {
            while (true)
            {
                var chara = Console.ReadKey();
                if (chara.KeyChar == 3)
                {
                    Console.WriteLine("ctrl-c");
                    //signal to gracefully exit
                }
                Console.WriteLine("c:{0}", chara);
            }
        }).Start();
    }
}