Как я могу продолжать запускать консольное приложение, пока не нажата клавиша (например Esc, нажата?)
Я предполагаю, что это обернуто вокруг цикла времени. Мне не нравится, ReadKey
поскольку он блокирует работу и запрашивает клавишу, а не просто продолжает и слушает нажатие клавиши.
Как это может быть сделано?
c#
console-application
karlstackoverflow
источник
источник
Console.ReadLine()
и все готово, нет?Вы можете немного изменить свой подход - используйте
Console.ReadKey()
для остановки приложения, но выполняйте работу в фоновом режиме:В
myWorker.DoStuff()
функции вы затем вызываете другую функцию в фоновом потоке (используяAction<>()
илиFunc<>()
это простой способ сделать это), а затем немедленно возвращаетесь.источник
Кратчайший путь:
Console.ReadKey()
является функцией блокировки, она останавливает выполнение программы и ожидает нажатия клавиши, но благодаря проверкеConsole.KeyAvailable
сначалаwhile
цикл не блокируется, а работает до тех пор, пока не Escбудет нажата кнопка.источник
Из видео-проклятия «Создание консольных приложений .NET в C #» Джейсона Робертса по адресу http://www.pluralsight.com
Мы могли бы сделать следующее, чтобы иметь несколько запущенных процессов
источник
Console.CursorVisible = false;
будет лучше избегать миганий курсора. Добавьте эту строку в качестве первой строки вstatic void Main(string[] args)
блоке.Вот подход для вас сделать что-то в другом потоке и начать слушать нажатие клавиши в другом потоке. И Консоль остановит свою обработку, когда ваш фактический процесс завершится или пользователь завершит процесс, нажав Escклавишу.
источник
Если вы используете Visual Studio, вы можете использовать «Пуск без отладки» в меню «Отладка».
Будет автоматически написано «Нажмите любую клавишу для продолжения ...» к консоли для вас после завершения приложения, и она оставит консоль открытой для вас, пока не будет нажата клавиша.
источник
Рассматривая случаи, которые некоторые другие ответы не обрабатывают хорошо:
Многие из решений на этой странице включают опрос
Console.KeyAvailable
или блокировкуConsole.ReadKey
. Хотя это правда, что .NETConsole
здесь не очень-то сотрудничает, вы можете использовать егоTask.Run
для перехода к более современномуAsync
режиму прослушивания.Основная проблема, о которой следует помнить, заключается в том, что по умолчанию ваш консольный поток не настроен на
Async
работу - это означает, что когда вы выпадаете из нижней части своейmain
функции, а неAsync
ожидаете завершения, ваш AppDoman и процесс завершатся. , Правильный способ решения этой проблемы - использовать AsyncContext Стивена Клири для полнойAsync
поддержки вашей однопоточной консольной программы. Но для более простых случаев, таких как ожидание нажатия клавиши, установка полного батута может быть излишней.Пример ниже будет для консольной программы, используемой в некотором итеративном пакетном файле. В этом случае, когда программа завершает свою работу, обычно она должна выходить без нажатия клавиши, а затем мы разрешаем дополнительное нажатие клавиши, чтобы предотвратить выход приложения. Мы можем приостановить цикл, чтобы исследовать вещи, возможно, возобновить, или использовать паузу в качестве известной «контрольной точки», в которой можно аккуратно вырваться из пакетного файла.
источник
с помощью приведенного ниже кода вы можете прослушивать нажатие клавиши SpaceBar в середине выполнения консоли и делать паузу, пока не будет нажата другая клавиша, а также прослушивать EscapeKey для прерывания основного цикла
источник
Согласно моему опыту, в консольных приложениях проще всего прочитать последнюю нажатую клавишу следующим образом (пример со стрелками):
Я использую, чтобы избежать циклов, вместо этого я пишу код выше в методе, и я вызываю его в конце обоих «Method1» и «Method2», поэтому после выполнения «Method1» или «Method2», Console.ReadKey () .Key готов снова прочитать ключи.
источник