Как я захватываю ctrl-c (SIGINT) в приложении консоли C#

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

210
задан Daniel A. White 21 February 2019 в 06:30
поделиться

2 ответа

117
ответ дан aku 23 November 2019 в 04:35
поделиться

Для этого используется событие 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. Это способ корректного завершения программы.

211
ответ дан 23 November 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: