在应用程序终止(Ctrl+C)之后运行一段代码
本文关键字:一段 代码 运行 之后 应用程序 Ctrl+C 终止 | 更新日期: 2023-09-27 18:18:46
在我的程序中,我在循环的每次迭代中接近文本文件,以避免运行时丢失任何数据。这是残酷的无效,而且我昨天仍然丢失了数据。
我有两个队列-"我做了什么"answers"做什么"。一段时间后,我需要结束这个应用程序,并记住这些队列为下一个应用程序运行。我通常使用Ctrl+ c终止应用程序。
有没有办法运行保存这些队列文件后,应用程序杀死?或者如何以用户身份正确结束控制台应用程序。
是否有可能自动运行一段代码?我的意思是,当我通过删除第一行来更新一些"队列文件"时,我需要将整个文件复制到tmp,而不是删除原始文件,然后将tmp文件复制到原始文件。但有时我在开始后马上按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();
}
}