Для этого используется событие Console.CancelKeyPress . Вот как это используется:
public static void Main(string[] args)
{
Console.CancelKeyPress += delegate {
// call methods to clean up
};
while (true) {}
}
Когда пользователь нажимает Ctrl + C, код в делегате запускается и программа завершается. Это позволяет выполнять очистку, вызывая необходимые методы. Обратите внимание, что код после делегата не выполняется.
В других ситуациях это не поможет. Например, если программа в настоящее время выполняет важные вычисления, которые не могут быть немедленно остановлены. В этом случае правильной стратегией может быть указание программе выйти после завершения расчета. Следующий код дает пример того, как это можно реализовать:
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. Это способ корректно завершить работу программы.