พิจารณาแอปพลิเคชันคอนโซลที่เริ่มต้นบริการบางอย่างในเธรดแยกต่างหาก สิ่งที่ต้องทำคือรอให้ผู้ใช้กด 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
ลูปในภายหลังจะได้รับการปรับให้เหมาะสมซึ่งนำไปสู่การวนซ้ำที่ไม่มีที่สิ้นสุด