Вирішення випадків, коли деякі інші відповіді не справляються добре:
- Чуйне : безпосереднє виконання коду обробки клавіш; уникає капризів опитування чи блокування затримок
- Необов’язковість : глобальне натискання клавіш увімкнено ; інакше додаток має нормально виходити
- Розділення проблем : менш інвазивний код прослуховування; працює незалежно від звичайного коду програми консолі.
Багато рішень на цій сторінці передбачають опитування 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
}
}