Wie kann ich meine Konsolenanwendung so lange ausführen, bis ein Tastendruck (wie Escgedrückt wird?)
Ich gehe davon aus, dass es um eine while-Schleife gewickelt ist. Ich mag es nicht, ReadKey
weil es den Betrieb blockiert und nach einer Taste fragt, anstatt einfach fortzufahren und auf den Tastendruck zu warten.
Wie kann das gemacht werden?
c#
console-application
karlstackoverflow
quelle
quelle
Console.ReadLine()
und schon sind Sie fertig , nein?Sie können Ihren Ansatz leicht ändern - verwenden
Console.ReadKey()
Sie diese Option, um Ihre App zu stoppen, aber erledigen Sie Ihre Arbeit in einem Hintergrund-Thread:In der
myWorker.DoStuff()
Funktion würden Sie dann eine andere Funktion in einem Hintergrundthread aufrufen (mitAction<>()
oder aufFunc<>()
einfache Weise) und dann sofort zurückkehren.quelle
Der kürzeste Weg:
Console.ReadKey()
ist eine Sperrfunktion, die die Ausführung des Programms stoppt und auf einen Tastendruck wartet, aber dank ÜberprüfungConsole.KeyAvailable
ersten wird diewhile
Schleife nicht blockiert, sondern läuft, bis die Escgedrückt wird.quelle
Aus dem Videofluch Erstellen von .NET-Konsolenanwendungen in C # von Jason Roberts unter http://www.pluralsight.com
Wir könnten folgen, um mehrere laufende Prozesse zu haben
quelle
Console.CursorVisible = false;
Vermeiden Sie am besten das Blinken des Cursors. Fügen Sie diese Zeile als erste Zeile imstatic void Main(string[] args)
Block hinzu.Hier ist ein Ansatz, mit dem Sie etwas in einem anderen Thread tun und die in einem anderen Thread gedrückte Taste anhören können. Und die Konsole stoppt ihre Verarbeitung, wenn Ihr eigentlicher Prozess endet oder der Benutzer den Prozess durch Drücken der EscTaste beendet.
quelle
Wenn Sie Visual Studio verwenden, können Sie im Menü Debuggen "Ohne Debuggen starten" verwenden.
Es wird automatisch geschrieben: "Drücken Sie eine beliebige Taste, um fortzufahren." Wenn Sie die Anwendung abgeschlossen haben, wird die Konsole für Sie geöffnet, bis eine Taste gedrückt wird.
quelle
Behandlung von Fällen, mit denen einige der anderen Antworten nicht gut umgehen:
Viele der Lösungen auf dieser Seite beinhalten das Abrufen
Console.KeyAvailable
oder BlockierenConsole.ReadKey
. ZwarConsole
ist .NET hier nicht sehr kooperativ, aber Sie können es verwendenTask.Run
, um zu einer modernerenAsync
Art des Hörens überzugehen.Das Hauptproblem, das Sie beachten sollten, ist, dass Ihr Konsolenthread standardmäßig nicht für den
Async
Betrieb eingerichtet ist. Wenn Sie also aus dem unteren Bereich Ihrermain
FunktionAsync
herausfallen , anstatt auf den Abschluss zu warten , werden AppDoman und Prozess beendet . Eine geeignete Möglichkeit, dies zu beheben , besteht darin, Stephen Clearys AsyncContext zu verwenden, um die vollständigeAsync
Unterstützung für Ihr Single-Threaded-Konsolenprogramm herzustellen . Aber für einfachere Fälle, wie das Warten auf einen Tastendruck, das Installieren eines vollen Trampolins jedoch übertrieben sein.Das folgende Beispiel bezieht sich auf ein Konsolenprogramm, das in einer iterativen Batchdatei verwendet wird. In diesem Fall sollte das Programm, wenn es mit seiner Arbeit fertig ist, normalerweise ohne Tastendruck beendet werden. Anschließend erlauben wir einen optionalen Tastendruck, um das Beenden der App zu verhindern . Wir können den Zyklus anhalten, um Dinge zu untersuchen, möglicherweise wieder aufzunehmen, oder die Pause als bekannten "Kontrollpunkt" verwenden, an dem die Batchdatei sauber herausgebrochen werden kann.
quelle
Mit dem folgenden Code können Sie das Drücken der SpaceBar während der Ausführung Ihrer Konsole anhören und eine Pause einlegen, bis eine andere Taste gedrückt wird. Außerdem können Sie auf EscapeKey warten, um die Hauptschleife zu unterbrechen
quelle
Nach meiner Erfahrung ist in Konsolen-Apps der einfachste Weg, die zuletzt gedrückte Taste zu lesen, wie folgt (Beispiel mit Pfeiltasten):
Ich vermeide Schleifen, schreibe stattdessen den obigen Code in eine Methode und rufe ihn am Ende von "Methode1" und "Methode2" auf. Nach der Ausführung von "Methode1" oder "Methode2" wird Console.ReadKey () Der Schlüssel ist bereit, die Schlüssel erneut zu lesen.
quelle