ऐसे मामलों को संबोधित करना जो कुछ अन्य जवाबों को अच्छी तरह से संभाल नहीं पाते हैं:
- उत्तरदायी : कीप हैंडलिंग कोड का प्रत्यक्ष निष्पादन; मतदान या अवरुद्ध देरी की योनि से बचा जाता है
- वैकल्पिकता : वैश्विक कुंजीपट ऑप्ट-इन है ; अन्यथा एप्लिकेशन को सामान्य रूप से बाहर निकलना चाहिए
- चिंताओं का पृथक्करण : कम आक्रामक सुनने का कोड; स्वतंत्र रूप से सामान्य कंसोल ऐप कोड का संचालन करता है।
इस पृष्ठ के कई समाधानों में मतदान Console.KeyAvailable
या अवरुद्ध करना शामिल है Console.ReadKey
। हालांकि यह सच है कि .NET Console
यहां बहुत सहयोगी नहीं है, आप सुनने के Task.Run
अधिक आधुनिक Async
मोड की ओर बढ़ने के लिए उपयोग कर सकते हैं ।
मुख्य मुद्दा यह है कि डिफ़ॉल्ट रूप से, आपका कंसोल थ्रेड Async
ऑपरेशन के लिए सेट नहीं किया गया है - जिसका अर्थ है, जब आप अपने main
फ़ंक्शन के निचले भाग से बाहर आते हैं, तो Async
पूर्णता की प्रतीक्षा करने के बजाय , आपका AppDoman और प्रक्रिया समाप्त हो जाएगी । इसे संबोधित करने का एक उचित तरीका यह होगा कि आप अपने सिंगल-थ्रेड कंसोल प्रोग्राम में पूर्ण समर्थन स्थापित करने के लिए स्टीफन क्लीरी के AsyncContext का उपयोग करें Async
। लेकिन सरल मामलों के लिए, जैसे कि कीपर के लिए इंतजार करना, एक पूर्ण ट्रैम्पोलिन स्थापित करना ओवरकिल हो सकता है।
नीचे दिया गया उदाहरण किसी प्रकार के पुनरावृत्त बैच फ़ाइल में उपयोग किए जाने वाले कंसोल प्रोग्राम के लिए होगा। इस मामले में, जब कार्यक्रम अपने काम के साथ किया जाता है, तो आम तौर पर इसे एक कीपर की आवश्यकता के बिना बाहर निकल जाना चाहिए , और फिर हम ऐप को बाहर निकलने से रोकने के लिए एक वैकल्पिक कुंजी प्रेस की अनुमति देते हैं । हम चीजों की जांच करने के लिए चक्र को रोक सकते हैं, संभवतः फिर से शुरू कर सकते हैं, या एक ज्ञात 'नियंत्रण बिंदु' के रूप में विराम का उपयोग कर सकते हैं, जिस पर बैच फ़ाइल को साफ करने के लिए।
static void Main(String[] args)
{
Console.WriteLine("Press any key to prevent exit...");
var tHold = Task.Run(() => Console.ReadKey(true));
// ... do your console app activity ...
if (tHold.IsCompleted)
{
#if false // For the 'hold' state, you can simply halt forever...
Console.WriteLine("Holding.");
Thread.Sleep(Timeout.Infinite);
#else // ...or allow continuing to exit
while (Console.KeyAvailable)
Console.ReadKey(true); // flush/consume any extras
Console.WriteLine("Holding. Press 'Esc' to exit.");
while (Console.ReadKey(true).Key != ConsoleKey.Escape)
;
#endif
}
}