Rozważ aplikację konsoli, która uruchamia niektóre usługi w osobnym wątku. Wystarczy, że poczekasz, aż użytkownik naciśnie Ctrl + C, aby go wyłączyć.Jak uruchomić aplikację konsoli .NET?
Który z poniższych sposobów jest lepszym sposobem?
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
}
Albo to, używając 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. Ponadto, ponieważ 'bool' nie jest zadeklarowany jako' volatile', istnieje pewna możliwość, że późniejsze odczytywanie '_quitFlag' w pętli' while' będzie zoptymalizowane, prowadząc do nieskończonej pętli. –