Рассматривая случаи, которые некоторые другие ответы не обрабатывают хорошо:
- Отзывчиво : прямое выполнение кода обработки нажатия клавиш; избегает капризов опроса или задержки блокировки
- Факультативность : глобальное нажатие является неавтоматического ; в противном случае приложение должно выйти нормально
- Разделение проблем : менее инвазивный код прослушивания; работает независимо от нормального кода консольного приложения.
Многие из решений на этой странице включают опрос Console.KeyAvailable
или блокировку Console.ReadKey
. Хотя это правда, что .NET Console
здесь не очень-то сотрудничает, вы можете использовать его Task.Run
для перехода к более современному Async
режиму прослушивания.
Основная проблема, о которой следует помнить, заключается в том, что по умолчанию ваш консольный поток не настроен на Async
работу - это означает, что когда вы выпадаете из нижней части своей main
функции, а не Async
ожидаете завершения, ваш AppDoman и процесс завершатся. , Правильный способ решения этой проблемы - использовать AsyncContext Стивена Клири для полной Async
поддержки вашей однопоточной консольной программы. Но для более простых случаев, таких как ожидание нажатия клавиши, установка полного батута может быть излишней.
Пример ниже будет для консольной программы, используемой в некотором итеративном пакетном файле. В этом случае, когда программа завершает свою работу, обычно она должна выходить без нажатия клавиши, а затем мы разрешаем дополнительное нажатие клавиши, чтобы предотвратить выход приложения. Мы можем приостановить цикл, чтобы исследовать вещи, возможно, возобновить, или использовать паузу в качестве известной «контрольной точки», в которой можно аккуратно вырваться из пакетного файла.
static void Main(String[] args)
{
Console.WriteLine("Press any key to prevent exit...");
var tHold = Task.Run(() => Console.ReadKey(true));
// ... do your console app activity ...
if (tHold.IsCompleted)
{
#if false // For the 'hold' state, you can simply halt forever...
Console.WriteLine("Holding.");
Thread.Sleep(Timeout.Infinite);
#else // ...or allow continuing to exit
while (Console.KeyAvailable)
Console.ReadKey(true); // flush/consume any extras
Console.WriteLine("Holding. Press 'Esc' to exit.");
while (Console.ReadKey(true).Key != ConsoleKey.Escape)
;
#endif
}
}