Considere una aplicación de consola que inicie algunos servicios en un hilo separado. Todo lo que tiene que hacer es esperar que el usuario presione Ctrl + C para apagarlo.¿Cómo mantener una aplicación de consola .NET ejecutándose?
¿Cuál de las siguientes es la mejor manera de hacer esto?
static ManualResetEvent _quitEvent = new ManualResetEvent(false);
static void Main() {
Console.CancelKeyPress += (sender, eArgs) => {
_quitEvent.Set();
eArgs.Cancel = true;
};
// kick off asynchronous stuff
_quitEvent.WaitOne();
// cleanup/shutdown and quit
}
O esto, utilizando Thread.Sleep (1):
static bool _quitFlag = false;
static void Main() {
Console.CancelKeyPress += delegate {
_quitFlag = true;
};
// kick off asynchronous stuff
while (!_quitFlag) {
Thread.Sleep(1);
}
// cleanup/shutdown and quit
}
+1. Además, dado que 'bool' no está declarado como' volátil', existe la posibilidad definitiva de que las lecturas subsiguientes a '_quitFlag' en el bucle' while' se optimicen, lo que daría lugar a un ciclo infinito. –