Behandlung von Fällen, mit denen einige der anderen Antworten nicht gut umgehen:
- Reaktionsschnell : direkte Ausführung des Tastendruck-Handhabungscodes; vermeidet die Unklarheiten beim Abrufen oder Blockieren von Verzögerungen
- Optionalität : Globaler Tastendruck ist Opt-In ; Andernfalls sollte die App normal beendet werden
- Trennung von Bedenken : weniger invasiver Abhörcode; arbeitet unabhängig vom normalen Konsolen-App-Code.
Viele der Lösungen auf dieser Seite beinhalten das Abrufen Console.KeyAvailable
oder Blockieren Console.ReadKey
. Zwar Console
ist .NET hier nicht sehr kooperativ, aber Sie können es verwenden Task.Run
, um zu einer moderneren Async
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 Ihrer main
Funktion Async
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ändige Async
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.
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
}
}