Wie kann ich eine Konsole geöffnet, bis CancelKeyPress Ereignis ausgelöst wird?

StackOverflow https://stackoverflow.com/questions/203246

  •  03-07-2019
  •  | 
  •  

Frage

Was ist der beste Weg, um eine Konsolenanwendung zu halten, so lange geöffnet, wie das CancelKeyPress Ereignis ausgelöst wurde nicht?

Ich würde es vorziehen, nicht Console.Read oder Console.ReadLine zu verwenden, wie ich will nicht, Eingaben akzeptieren. Ich möchte nur die zugrundeliegende Anwendung ermöglichen, auf die Konsole Ereignisdetails zu drucken, wie sie abgefeuert werden. Dann, wenn die CancelKeyPress Ereignis ausgelöst wird, möchte ich anmutig die Anwendung heruntergefahren wird.

War es hilfreich?

Lösung

Ich gehe davon aus, dass „anmutig die Anwendung heruntergefahren“ ist der Teil, den Sie mit hier zu kämpfen haben. Andernfalls Ihre Anwendung wird automatisch Ausgang auf ctrl-c. Sie sollten den Titel ändern.

Hier ist eine kurze Demo von dem, was ich glaube, Sie brauchen. Es könnte etwas mit der Verwendung von Sperren und Monitore für die Benachrichtigung verfeinert werden. Ich bin nicht sicher genau das, was Sie brauchen, obwohl, so dass ich dies nur Pose ...

class Program
{

    private static volatile bool _s_stop = false;

    public static void Main(string[] args)
    {
        Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);
        while (!_s_stop)
        {
            /* put real logic here */
            Console.WriteLine("still running at {0}", DateTime.Now);
            Thread.Sleep(3000);
        }
        Console.WriteLine("Graceful shut down code here...");

        //don't leave this...  demonstration purposes only...
        Console.ReadLine();
    }

    static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
    {
        //you have 2 options here, leave e.Cancel set to false and just handle any
        //graceful shutdown that you can while in here, or set a flag to notify the other
        //thread at the next check that it's to shut down.  I'll do the 2nd option
        e.Cancel = true;
        _s_stop = true;
        Console.WriteLine("CancelKeyPress fired...");
    }

}

Die _s_stop boolean volatil sein sollte erklärt oder ein übermäßig ehrgeiziges Optimierer könnte das Programm in einer Schleife führt unendlich.

Andere Tipps

Die _s_stop boolean sollte im Beispielcode volatile deklariert werden, oder ein übermäßig ehrgeizig Optimierer könnten das Programm in einer Schleife führen unendlich.

Es gibt bereits einen Handler CancelKeyPress gebunden, die Ihre Anwendung beendet wird, der einzige Grund, um es zu Haken, wenn Sie das Ereignis abfangen wollen, und verhindern, dass die App zu schließen.

In Ihrer Situation, setzen Sie Ihre App in eine Endlosschleife, und lassen Sie die in Event-Handler es töten gebaut. Sie können so etwas wie Warte in Verwendung (1) oder einen Hintergrundprozess aussehen wollen es aus mit Tonnen von CPU zu verhindern, während nichts zu tun.

Sie einfach Ihr Programm oder Codes ohne Debuggen ausführen, auf der Tastatur Schlüssel in STRG + f5 anstelle von F5 (Debugging).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top