कंसोल एप्लिकेशन पर विचार करें जो कुछ सेवाओं को एक अलग थ्रेड में शुरू करता है। इसे बंद करने के लिए उपयोगकर्ता को 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
}
या यह, थ्रेड का उपयोग करना। सो (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
लूप में पढ़ी जाने वाली सामग्री को अनुकूलित किया जाएगा, जिससे अनंत लूप बन जाएगा।