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