Рассмотрим консольное приложение, которое запускает некоторые службы в отдельном потоке. Все, что ему нужно сделать, это дождаться, пока пользователь нажмет 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
цикле будут оптимизированы, что приведет к бесконечному циклу.