Considere um aplicativo de console que inicializa alguns serviços em um thread separado. Tudo o que precisa fazer é esperar que o usuário pressione Ctrl + C para desligá-lo.
Qual das alternativas a seguir é a melhor maneira de fazer isso?
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
}
Ou isso, usando 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
}
bool
não é declarado comovolatile
, há a possibilidade definitiva de que as leituras subsequentes para_quitFlag
nowhile
loop sejam otimizadas, levando a um loop infinito.