Jak mogę nadal uruchamiać aplikację konsoli, dopóki nie zostanie naciśnięty klawisz (jak Esczostanie naciśnięty?)
Zakładam, że jest owinięty wokół pętli while. Nie podoba mi się, ReadKey
ponieważ blokuje działanie i prosi o klawisz, zamiast po prostu kontynuować i słuchać naciśnięcia klawisza.
Jak można to zrobić?
c#
console-application
karlstackoverflow
źródło
źródło
Console.ReadLine()
i gotowe, nie?Możesz nieco zmienić swoje podejście - użyj,
Console.ReadKey()
aby zatrzymać aplikację, ale wykonuj swoją pracę w tle:W
myWorker.DoStuff()
funkcji wywołujesz inną funkcję w wątku w tle (używającAction<>()
lubFunc<>()
jest to łatwy sposób, aby to zrobić), a następnie natychmiast powracasz.źródło
Najkrótsza droga:
Console.ReadKey()
jest funkcją blokującą, zatrzymuje wykonywanie programu i czeka na naciśnięcie klawisza, ale dzięki sprawdzeniuConsole.KeyAvailable
najpierwwhile
pętla nie jest blokowana, ale działa do momentu Escnaciśnięcia.źródło
Z klątwy wideo Budowanie aplikacji konsoli .NET w języku C # przez Jasona Robertsa na stronie http://www.pluralsight.com
Możemy wykonać następujące czynności, aby uruchomić wiele procesów
źródło
Console.CursorVisible = false;
najlepiej będzie uniknąć migania kursora. Dodaj tę linię jako pierwszą linię wstatic void Main(string[] args)
bloku.Oto podejście, aby zrobić coś z innego wątku i zacząć słuchać klawisza wciśniętego w innym wątku. Konsola przerwie przetwarzanie, gdy zakończy się faktyczny proces lub użytkownik zakończy proces, naciskając Escklawisz.
źródło
Jeśli korzystasz z programu Visual Studio, możesz użyć opcji „Rozpocznij bez debugowania” w menu debugowania.
Automatycznie napisze „Naciśnij dowolny klawisz, aby kontynuować.” do konsoli po zakończeniu aplikacji i pozostawi konsolę otwartą do momentu naciśnięcia klawisza.
źródło
Rozwiązanie problemów, z którymi niektóre inne odpowiedzi nie radzą sobie dobrze:
Wiele rozwiązań na tej stronie wymaga odpytywania
Console.KeyAvailable
lub blokowaniaConsole.ReadKey
. Chociaż prawdą jest, że .NETConsole
nie jest tu zbyt kooperatywny, możeszTask.Run
przejść do bardziej nowoczesnegoAsync
trybu słuchania.Głównym problemem, o którym należy pamiętać, jest to, że domyślnie wątek konsoli nie jest skonfigurowany do
Async
działania - co oznacza, że gdy wypadniesz z dołumain
funkcji, zamiastAsync
czekać na zakończenie, twoja aplikacja i proces zakończą się . Właściwym sposobem rozwiązania tego problemu byłoby użycie AsyncContext Stephena Cleary'ego do ustanowienia pełnegoAsync
wsparcia w jednowątkowym programie konsoli. Ale w prostszych przypadkach, takich jak oczekiwanie na naciśnięcie klawisza, zainstalowanie pełnej trampoliny może być przesadą.Poniższy przykład dotyczy programu konsoli używanego w pewnego rodzaju iteracyjnym pliku wsadowym. W takim przypadku, gdy program zakończy pracę, zwykle powinien zakończyć działanie bez konieczności naciskania klawisza, a następnie zezwalamy na opcjonalne naciśnięcie klawisza, aby uniemożliwić zamknięcie aplikacji. Możemy wstrzymać cykl w celu zbadania rzeczy, być może wznowić, lub użyć pauzy jako znanego „punktu kontrolnego”, w którym można czysto wyrwać się z pliku wsadowego.
źródło
z poniższym kodem możesz słuchać wciskania klawisza SpaceBar, w trakcie wykonywania konsoli i wstrzymywać się do momentu naciśnięcia innego klawisza, a także nasłuchiwać EscapeKey za zerwanie głównej pętli
źródło
Z mojego doświadczenia wynika, że w aplikacjach konsolowych najłatwiejszy sposób odczytania ostatniego naciśniętego klawisza jest następujący (przykład z klawiszami strzałek):
Używam, aby unikać pętli, zamiast tego piszę powyższy kod w metodzie i wywołuję go na końcu zarówno „Method1”, jak i „Method2”, więc po wykonaniu „Method1” lub „Method2” Console.ReadKey () Klawisz jest gotowy do ponownego odczytania kluczy.
źródło