考虑一个控制台应用程序,该应用程序在单独的线程中启动某些服务。它所要做的就是等待用户按下Ctrl + C将其关闭。
以下哪一项是更好的方法?
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
}
或者使用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
并不像宣称volatile
,有一定的可能性,后续读取到_quitFlag
的while
循环将被优化掉,从而导致一个无限循环。