2012-11-10 16 views
6

निष्पादित करना बंद करें मैं कुछ सी # Winforms/WPF कोड के साथ थोड़ा सा खेल रहा हूं और बस कुछ अजीब पर ठोकर खा रहा हूं। चलो कहते हैं कि मैं इस तरह के कोड करते हैं:सी # कोड

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DoSomething(); 

     // maybe something more if everything went ok 
    } 
} 

क्या पहेली मुझे लगता है कि मैं सिर्फ प्रणाली DoSomething से आवेदन बंद नहीं कर सकते से पहले निर्माता अपने काम खत्म है। यदि DoSomething के निष्पादन के दौरान कुछ भी विफल हो जाता है, तो मुझे तुरंत एप्लिकेशन बंद करना होगा, लेकिन यह केवल चल रहा है, भाग // maybe something more... निष्पादित करता है और फिर बंद हो जाता है, लेकिन यह मेरे लिए बहुत देर हो चुकी है।

मुझे निम्नलिखित return; के साथ निर्माता के अंदर फ़ॉर्म को बंद करने के लिए कोड रखना होगा और फिर यह काम करता है, लेकिन मुझे वास्तव में यह स्वीकार्य समाधान नहीं मिलता है। मैं कन्स्ट्रक्टर से अपने तरीकों से इस तरह के सत्यापन तर्क को स्थानांतरित करने की कोशिश कर रहा हूं।

मैं

public void DoSomething() 
{ 
    Close(); 
} 

या

public void DoSomething() 
{ 
    Application.Current.Shutdown(); 
} 

तरह बातें करने की कोशिश की लेकिन यह काम करने के लिए प्रतीत नहीं होता। हां, दोनों कोड एप्लिकेशन बंद करते हैं, लेकिन केवल पूरी तरह से समाप्त कन्स्ट्रक्टर कोड के बाद।

Why मुझे ऐसी चीज़ की आवश्यकता होगी? खैर, क्योंकि स्टार्टअप पर मुझे विभिन्न चीजों की जांच करने की आवश्यकता है, जैसे कनेक्शन और हार्डवेयर की उपलब्धता, उपयोगकर्ता को प्रमाणित करना आदि, और यदि कुछ भी विफल हो जाता है, तो अधिक कोड निष्पादित करने का कोई मतलब नहीं है।

विनफॉर्म और डब्ल्यूपीएफ (इसलिए टैग) के साथ एक ही सिद्धांत का प्रयास किया, वही काम करता है।

क्या कोई स्पष्टीकरण या शायद समाधान प्रदान कर सकता है? मुझे पता है कि यह शायद आप में से कुछ के लिए बहुत ही बुनियादी है, लेकिन कृपया मेरे साथ बेकार है, मैं मुख्य रूप से एक विंडोज प्रोग्रामर नहीं हूं, इसलिए यह मेरे लिए थोडा नया है। वेबसाइटें थोड़ा अलग तरह से काम ... :)

+0

जब पहला फॉर्म बनाया जा रहा है तो कोई ऐप नहीं चल रहा है, इसलिए शटडाउन() को शायद अनदेखा किया जा सकता है। एवीप ने अच्छा समाधान दिया। –

उत्तर

8

बस अपनी स्थिति में Environment.Exit(-1) का उपयोग करने का प्रयास करें और सभी अच्छे होंगे।

जोड़ा गया:यह आपके लिए सबसे अच्छा संदर्भ है जो मैं प्राप्त कर सकता हूं।

अंतर Application.Exit vs Application.Shutdown vs Environment.Exit

के बीच

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

Application.Shutdown() (व्यापक रूप से) एक WPF अनुप्रयोग में एप्लिकेशन.एक्सिट() के बराबर है। हालांकि, आपके पास थोड़ा अधिक नियंत्रण है क्योंकि आप शटडाउनमोड सेट कर सकते हैं ताकि मुख्य विंडो बंद होने पर एप्लिकेशन बंद हो जाए, आखिरी विंडो बंद हो या केवल तभी जब यह विधि कहा जाता है।

Environment.Exit() सभी चल रहे धागे को मारता है और प्रक्रिया स्वयं ही पत्थर मर जाती है। इसका उपयोग केवल अंतिम उपाय के रूप में डब्ल्यूएफ या डब्ल्यूपीएफ में किया जाना चाहिए जब किसी भी कारण से अधिक आकर्षक तरीके काम नहीं कर रहे हैं। इसका उपयोग कंसोल एप्लिकेशन से अचानक बाहर निकलने के लिए भी किया जा सकता है।

एक अन्य संदर्भ: How to properly exit a C# application?

+0

धन्यवाद, यह अपेक्षा के अनुसार व्यवहार करता प्रतीत होता है। क्या आप समझा सकते हैं, यह 'शटडाउन()' या 'बंद()' के साथ क्यों काम नहीं करता है? क्या आपके समाधान के लिए कोई नुकसान है? – walther

+0

कोई नुकसान नहीं है। इसके बजाए पर्यावरण। मुख्य जिम्मेदारी निकालें प्रक्रिया को समाप्त करना है और अंतर्निहित ओएस निर्दिष्ट निकास कोड देता है। संदर्भ: http://msdn.microsoft.com/en-us/library/system.environment.exit.aspx –

+0

धन्यवाद। कई बार मुझे अपवादों को फेंकने की आवश्यकता नहीं होती है, बस एक साधारण "छोड़ दें"। :) – walther

0

का संभावित हल एक अपवाद फेंक और application.UnhandledException

3

में इसे संभाल आप हमेशा अपने साथी डेवलपर अनदेखा कर सकते हैं और सिर्फ Environment.FailFast()

लेकिन वास्तव में उपयोग करने के लिए हो सकता है - डॉन 'टी। यदि आपके पास महत्वपूर्ण चीजें हैं, तो एसए सीरियल पोर्ट को सत्यापित करने पर परमाणु ऊर्जा संयंत्र से जुड़ा हुआ है, बस इसे पहले करें। पर आपको Main() कहा जाता है, तो आपको कोई नियम नहीं है।

+0

क्या आप कृपया विस्तृत कर सकते हैं, ऐसा क्यों न करें? एफएसएक्स का समाधान काम करता प्रतीत होता है, क्या उनके दृष्टिकोण से अवगत होने की कोई संभावित समस्या है? 'Application.Run' केवल Winforms (या शायद मैं गलत हूँ) के लिए प्रासंगिक है, लेकिन WPF के बारे में क्या?कृपया, क्या आप अपने समाधान को स्पष्ट करने के लिए डब्ल्यूपीएफ में एक उदाहरण दिखा सकते हैं, उदा। आप महत्वपूर्ण बूट निर्देश कहां रखेंगे (खुले बंदरगाहों की जांच और उस तरह की चीजें)? सरल उदाहरण होगा। – walther

0

एक अपवाद वर्ग को परिभाषित करें:

public class InitializationException : Exception 
{ 
    public InitializationException() 
    {} 

    public InitializationException(string msg) 
     : base(msg) 
    {} 

    public InitializationException(string msg, Exception inner) 
     : base(msg, inner) 
    {} 
} 

और बदलने के अपने कोड इस तरह:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     try 
     { 
      DoSomething(); 

      // maybe something more if everything went ok 
     } 
     catch(InitializationException ex) 
     { 
      // log the exception 
      Close(); 
     } 
    } 

    public void DoSomething() 
    { 
     if (notSomethingOK) 
      throw new InitializationException("Something is not OK and the applicaiton must shutdown."); 
    } 
} 

यह एक स्वच्छ और पोषणीय समाधान है।

1

आपकी समस्या के लिए पहले ही व्यवहार्य समाधान पोस्ट किए जा चुके हैं।

बस अपने अनुवर्ती प्रश्न का उत्तर देने के लिए: कारण है कि बंद करें() और शटडाउन() जैसे तरीके आपके आवेदन से तुरंत बाहर नहीं निकलते हैं, दोनों ही एप्लिकेशन को संदेश की कतार में संदेशों को धक्का देते हैं। उन्हें केवल मेनविंडो के कन्स्ट्रक्टर के समाप्त होने के बाद संसाधित किया जाता है और कोड निष्पादन संदेश प्रोसेसिंग लूप पर वापस आ जाता है, शायद कतार में कुछ अन्य लंबित संदेशों को भी संभाला जा सकता है। इसके विपरीत, Environment.Exit() या Environment.FailFast() जैसी विधियां हार्ड-कोर ओएस फ़ंक्शंस हैं जो प्रक्रिया को तुरंत कम या कम करती हैं।

+0

स्पष्टीकरण के लिए धन्यवाद। शर्म मैं कई उत्तरों का चयन नहीं कर सकता। आपके लिए कम से कम +1 भी :) – walther

0
System.Windows.Forms.Application.Exit(); 
0

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

यह न भूलें कि आप केवल वापसी कर सकते हैं; कन्स्ट्रक्टर से, यदि आपको इसके निष्पादन को तोड़ने की आवश्यकता है। यह बेहतर रणनीति है (ज्यादातर बार आपको कुछ पाठ प्रदर्शित किए बिना त्रुटि पर एप्लिकेशन को बंद करने की आवश्यकता नहीं होती है)।

विंडोज़/डब्ल्यूपीएफ पर "खिड़की दिखाया गया", "दृश्यता बदल गई", "लोड" और सी # में कई अन्य घटनाएं हैं, जिन्हें आप वर्चुअल रूप से ओवरराइड कर सकते हैं या ईवेंट हैंडलर के रूप में जोड़ सकते हैं। वहां अपना फॉर्म/एप शुरू करें।

वे सामान्य तरीके हैं इसलिए सभी काम अपेक्षित हैं। आप अपवाद फेंकने का प्रयास कर सकते हैं कि आपका एप्लिकेशन एंट्री पॉइंट (मुख्य फ़ंक्शन) बस पकड़ और अनदेखा कर देगा।

WPF के लिए, यह जांचें: - https://msdn.microsoft.com/en-us/library/system.windows.forms.application.setunhandledexceptionmode(v=vs.110).aspx