Come posso tenere aperta una console fino a quando non viene generato l'evento CancelKeyPress?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Qual è il modo migliore per tenere aperta un'applicazione console fino a quando l'evento CancelKeyPress non è stato attivato?

Preferirei non utilizzare Console.Read o Console.ReadLine poiché non voglio accettare l'input. Voglio solo consentire all'applicazione sottostante di stampare sui dettagli dell'evento console quando vengono attivati. Quindi, una volta generato l'evento CancelKeyPress, voglio chiudere con garbo l'applicazione.

È stato utile?

Soluzione

Suppongo che "chiudere con grazia l'applicazione" è la parte con cui stai lottando qui. In caso contrario, l'applicazione verrà automaticamente chiusa su ctrl-c. Dovresti cambiare il titolo.

Ecco una breve demo di ciò che penso tu abbia bisogno. Potrebbe essere perfezionato un po 'di più con l'uso del blocco e dei monitor per le notifiche. Non sono sicuro di cosa tu abbia bisogno, quindi proporrò questo ...

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...");
    }

}

Il valore booleano _s_stop dovrebbe essere dichiarato volatile o un ottimizzatore eccessivamente ambizioso potrebbe causare il ciclo infinito del programma.

Altri suggerimenti

Il booleano _s_stop dovrebbe essere dichiarato volatile nel codice di esempio, oppure un ottimizzatore eccessivamente ambizioso potrebbe causare il ciclo infinito del programma.

Esiste già un gestore associato a CancelKeyPress che termina l'applicazione, l'unica ragione per agganciarla è se si desidera intercettare l'evento e impedire la chiusura dell'app.

Nella tua situazione, inserisci l'app in un ciclo infinito e lascia che il gestore eventi incorporato la uccida. Potresti voler esaminare l'utilizzo di qualcosa come Wait (1) o un processo in background per impedirgli di usare tonnellate di CPU senza fare nulla.

Esegui semplicemente il tuo programma o codici senza debug, sul tasto della tastiera in CTRL + f5 anziché F5 (debug).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top