C # एप्लिकेशन से सही तरीके से कैसे बाहर निकलें?


197

मेरा C # में प्रकाशित आवेदन है। यहाँ समस्या यह है कि जब भी मैं रेड एग्जिट बटन पर क्लिक करके मुख्य फॉर्म को बंद करता हूं, तो यह फॉर्म को बंद कर देता है लेकिन यह एप्लिकेशन को बंद नहीं करता है। मुझे यह पता चला जब मैंने कंप्यूटर को बंद करने की कोशिश की, उम्मीद है कि मैंने जो एप्लिकेशन बनाया था वह आसानी से चल रहा था फिर मुझे बहुत सारे चाइल्ड विंडो द्वारा बमबारी की गई जिसके साथ मैंने MessageBoxअलर्ट डाल दिया है ।

मैंने कोशिश की Application.Exitलेकिन यह अभी भी सभी बच्चे की खिड़कियों और अलर्टों को कॉल करता है और मुझे नहीं पता कि इसका उपयोग कैसे करना है Environment.Exitऔर इसे किस पूर्णांक में डालना है।

वैसे, जब भी मेरे फॉर्म formclosedया form closingइवेंट को कॉल करते हैं, मैं एप्लिकेशन को this.Hide()फ़ंक्शन के साथ बंद कर देता हूं ; क्या यह प्रभावित करता है कि मेरा आवेदन अब कैसे व्यवहार कर रहा है?


2
FormClosed या FormClosing को न संभालें
SLaks

1
तो आप कहते हैं कि आप केवल फॉर्म को बंद करने के बजाय छिपा रहे हैं? शायद यही कारण है कि आवेदन समाप्त नहीं हो रहा है, इसके अभी भी खुले (छिपे हुए) रूप हैं।
15

तो मैं इस सब को बदल दूं।
जॉन अर्नेस्ट ग्वाडालूप

1
आपको Hide () या Close () की आवश्यकता नहीं है।
हेनक होल्टरमैन

1
करीबी कार्यों और घटनाओं से संबंधित कोड पोस्ट करें।
हेनक होल्टरमैन

जवाबों:


329

MSDN से:

Application.Exit

सभी संदेश पंपों को सूचित करता है जिन्हें उन्हें समाप्त करना चाहिए, और फिर संदेशों के संसाधित होने के बाद सभी एप्लिकेशन विंडो को बंद कर देता है। यदि आप Application.Run (WinForms एप्लिकेशन) को कॉल करते हैं, तो यह उपयोग करने के लिए कोड है। यह विधि सभी थ्रेड पर सभी चल रहे संदेश लूप को रोकती है और अनुप्रयोग की सभी विंडो बंद कर देती है।

Environment.Exit

इस प्रक्रिया को समाप्त करता है और अंतर्निहित ऑपरेटिंग सिस्टम को निर्दिष्ट निकास कोड देता है। जब आप कंसोल एप्लिकेशन का उपयोग कर रहे हैं तो यह कॉल करने का कोड है।

यह लेख, Application.Exit बनाम Environment.Exit , एक अच्छे सिरे की ओर इंगित करता है:

आप यह निर्धारित कर सकते हैं कि संपत्ति की System.Windows.Forms.Application.Runजांच करके बुलाया गया System.Windows.Forms.Application.MessageLoopहै या नहीं। यदि सच है, तो रन को बुलाया गया है और आप मान सकते हैं कि एक WinForms एप्लिकेशन निम्नानुसार निष्पादित कर रहा है।

if (System.Windows.Forms.Application.MessageLoop) 
{
    // WinForms app
    System.Windows.Forms.Application.Exit();
}
else
{
    // Console app
    System.Environment.Exit(1);
}

संदर्भ: क्यों Application.Exit काम करने में विफल रहेगा?


यह मेरे लिए वास्तव में उपयोगी था क्योंकि मेरे पास एक WinForms ऐप था जिसमें एक तर्क था ताकि यह चुपचाप चल सके और इसलिए एक फ़ॉर्म नहीं दिखा। जब फ़ॉर्म छिपा हुआ था, तब Application.Exit()ऐप से बाहर निकलने में विफल रहा, हालांकि Environment.Exit(1)एक आकर्षण की तरह काम किया।
डिब

5
प्रश्न में त्रुटि के कारण बाहर निकलने का उल्लेख नहीं किया गया था, इसलिए निकास कोड शून्य होना चाहिए: Environment.Exit(0) किसी भी गैर-शून्य मान का अर्थ एप्लिकेशन-विशिष्ट त्रुटि कोड होना चाहिए जो स्क्रिप्ट द्वारा उचित कार्रवाई करने के लिए उपयोग किया जा सकता है। (यह नया कोड है और एक WinForms अनुप्रयोग है, इसलिए इस मामले में बात करने की संभावना नहीं है, लेकिन कमांड लाइन टूल लिखने वाले किसी भी व्यक्ति के लिए जानना अच्छा है।)
यिपिप

Environment.Exitरूपों आवेदन के लिए भी इस्तेमाल किया जा सकता है।
बैदीपर्मागी

1
अगर मैं गलत हूं तो मुझे सुधारो लेकिन मुझे लगता है कि returnबाद में एक बयान से इस दृष्टिकोण में सुधार होगा। जैसा कि मैंने समझा था कि कोड Application.Exit()एक returnबयान तक जारी रहेगा ।
रात

17

मुझे पता है कि यह समस्या आपके पास नहीं है, हालांकि एक और कारण यह हो सकता है कि आपके आवेदन में एक गैर पृष्ठभूमि धागा खुला हो।

using System;
using System.Threading;
using System.Windows.Forms;

namespace Sandbox_Form
{
    static class Program
    {
        private static Thread thread;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            thread = new Thread(BusyWorkThread);
            thread.IsBackground = false;
            thread.Start();

            Application.Run(new Form());

        }

        public static void BusyWorkThread()
        {
            while (true)
            {
                Thread.Sleep(1000);
            }
        }
    }
}

जब IsBackgroundहै falseयह अपने कार्यक्रम धागा कम्प्लिट्स तक खुला रखेंगे, अगर आप सेट IsBackgroundकरने के लिए trueधागा कार्यक्रम खुला नहीं रखेंगे। चीजें जैसे BackgroundWoker, ThreadPoolऔर Taskसभी आंतरिक रूप से IsBackgroundसेट के साथ एक धागे का उपयोग करते हैं true


14

जो तुम्हे चाहिए वो है System.Environment.Exit(1);

और यह सिस्टम नेमस्पेस "सिस्टम का उपयोग करना" का उपयोग करता है जो कि परियोजना शुरू करते समय बहुत अधिक हमेशा होता है।


2
यह केवल कंसोल एप्लिकेशन के लिए अधिक उपयुक्त है।
निधिन डेविड

नोट करने के लिए एक बात है FormClosing / FormClosed घटनाओं को पर्यावरण के लिए नहीं बुलाया जाएगा। यह भी बाहर निकलें केवल एक त्रुटि होने पर गैर-बीमित होना चाहिए,
राफेल स्मिट

9

मैं या तो निम्न में से एक होगा:

Application.Exit ();

एक जीत के लिए या

Environment.Exit (0);

कंसोल एप्लिकेशन के लिए (winforms पर भी काम करता है)।

धन्यवाद!


WinForms के लिए भी पर्यावरण। एक्सिट (0) काम करता है, बिना किसी अपवाद को फेंकने के लिए आवेदन मौजूद है।
मुल्लेअन

8

वैसे। जब भी मेरे फॉर्म कॉल किए गए फॉर्मल या फॉर्म क्लोजिंग इवेंट को कॉल करते हैं, तो मैं इस के साथ तालमेल को बंद कर देता हूं। () फ़ंक्शन। क्या यह प्रभावित करता है कि मेरा आवेदन अब कैसे व्यवहार कर रहा है?

संक्षेप में, हाँ। पूरा आवेदन तब समाप्त हो जाएगा जब मुख्य फॉर्म ( विधि के माध्यम से शुरू Application.Runकिया गया Main) बंद हो जाता है (छिपा नहीं)।

अगर आपका मुख्य फॉर्म बंद होने पर आपका पूरा आवेदन हमेशा पूरी तरह से समाप्त हो जाना चाहिए तो आपको बस उस फॉर्म को बंद हैंडलर को हटा देना चाहिए। उस ईवेंट को रद्द न करके और जब उपयोगकर्ता इसे बंद कर देगा तब आप उन्हें अपना इच्छित व्यवहार प्राप्त कर लेंगे। अन्य सभी रूपों के लिए, यदि आप फार्म के उसी उदाहरण को फिर से दिखाने का इरादा नहीं रखते हैं, तो आप बस उन्हें बंद करने और उन्हें छिपाने के बजाय, केवल उन्हें बंद करने दें। यदि आप उन्हें फिर से दिखा रहे हैं, तो उन्हें छिपाना ठीक हो सकता है।

यदि आप उपयोगकर्ता को अपने मुख्य फॉर्म के लिए "x" पर क्लिक करने में सक्षम होना चाहते हैं, लेकिन एक और रूप खुला रहता है और, वास्तव में, "नया" मुख्य रूप बन जाता है, तो यह थोड़ा और अधिक जटिल है। ऐसे मामले में आपको इसे बंद करने के बजाय सिर्फ अपने मुख्य रूप को छिपाने की आवश्यकता होगी, लेकिन आपको किसी प्रकार के तंत्र को जोड़ना होगा जो वास्तव में मुख्य रूप को बंद कर देगा जब आप वास्तव में अपने ऐप को समाप्त करना चाहते हैं। यदि यह स्थिति है कि आप में हैं, तो आपको अपने प्रश्न के बारे में अधिक विवरण जोड़ना होगा कि किस प्रकार के अनुप्रयोगों को वास्तव में कार्यक्रम को समाप्त करना चाहिए और क्या नहीं करना चाहिए।


3

करते हो क्या:

Application.Run(myForm);

आपके मुख्य में ()

फॉर्म बंद होने पर मुझे एप्लिकेशन को मारना बहुत आसान तरीका लगा।


1
हाँ इसमें Application.un है। मुख्य में Program.cs फ़ाइल में। मैं इसे बंद करने के लिए क्या करूं?
जॉन अर्नेस्ट ग्वाडालूप

लेकिन आप अपने मुख्य फॉर्म को रन के लिए पास करते हैं, है ना? लाल X पर क्लिक करके आप जिस फॉर्म को बंद करते हैं।
लाइटस्ट्रीकर

हाँ मेरे पास है सर। यह ऐसा है: Application.Run (new Form2 ());
जॉन अर्नेस्ट गुआडालूपे

उस स्थिति में, यदि रन के लिए दिया गया मुख्य फॉर्म वास्तव में पूरी तरह से बंद था, तो एप्लिकेशन स्वचालित रूप से बाहर निकल जाएगा। आपको तब ट्रैक करना चाहिए कि क्यों वह रूप अभी भी खुला है, चल रहा है या कहीं छिपा हुआ है।
लाइटस्टाइकर


-4

इस स्थिति में, App.xaml.cs में onExit () विधि को ओवरराइड करने के लिए आवेदन से बाहर निकलने का सबसे उचित तरीका:

protected override void OnExit(ExitEventArgs e) {
    base.OnExit(e); 
}

जब भी कोई निकास घटना होती है, तो आपको कोड निष्पादित करने की अनुमति देता है, लेकिन वास्तव में बाहर निकलने की घटना नहीं होती है।
jpaugh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.