Considérez une application console qui démarre certains services dans un thread distinct. Tout ce qu'il faut faire est d'attendre que l'utilisateur appuie sur Ctrl + C pour l'arrêter.
Laquelle des propositions suivantes est la meilleure façon de procéder?
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 ceci, en utilisant 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'est pas déclaré commevolatile
, il y a la possibilité définitive que les lectures ultérieures_quitFlag
dans lawhile
boucle soient optimisées, conduisant à une boucle infinie.