Hãy xem xét một ứng dụng Console khởi động một số dịch vụ trong một chuỗi riêng biệt. Tất cả những gì cần làm là đợi người dùng nhấn Ctrl + C để tắt nó.
Cách nào sau đây là cách tốt hơn để làm điều này?
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
}
Hoặc điều này, sử dụng 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
không được khai báo làvolatile
, nên có khả năng chắc chắn rằng các lần đọc tiếp theo_quitFlag
trongwhile
vòng lặp sẽ bị tối ưu hóa, dẫn đến một vòng lặp vô hạn.