2009-08-21 8 views
31

मैं यह पता लगाने की कोशिश कर रहा हूं कि मुझे किस का उपयोग करना चाहिए। डायलॉग मोड में एक फॉर्म की मेरी WinForm ऐप आग को बंद करने पर। वह फॉर्म एक पृष्ठभूमि कार्यकर्ता चलाता है जो दूरस्थ डीबी के साथ डीबी सिंक करता है और "स्पलैश फॉर्म" पर इसकी प्रगति प्रदर्शित करता है। -> बाहर निकलें और घटना मेंआवेदन। एक्सिट() बनाम आवेदन। एक्सिट थ्रेड() बनाम पर्यावरण। एक्सिट()

private void CloseMyApp() 
{ 
    SaveUserSettings(); 

    splashForm = new SplashForm(); 
    splashForm.ShowDialog(); 

    Application.ExitThread(); 
    //Application.Exit(); 
} 

जो है मैं क्या मेनू से मेरी ऐप को बंद करने के लिए कॉल:

मैं बहुत की तरह एक विधि है। Application.Exit() निम्नलिखित त्रुटि देता है ->

संग्रह संशोधित किया गया था; गणना ऑपरेशन निष्पादित नहीं हो सकता है।

अब मैंने पढ़ा है कि Environment.Exit() क्रूर है और वहाँ शायद कुछ अपने अनुप्रयोग के साथ गलत (here देखें) का मतलब है।

Application.ExitThread() काम करता है लेकिन मुझे आश्चर्य है कि यह केवल काम करने के लिए अपरिपक्व हो सकता है और जैसा कि मैंने यह सुनिश्चित नहीं किया है कि यह सामान्य रूप से ऐसा करने के लिए उचित नहीं है।

उत्तर

24

दुर्भाग्यवश, इनमें से किसी भी समस्या का कारण नहीं है, और इन सभी परिदृश्यों में वास्तव में मौजूद है (भले ही आपको संदेश नहीं मिलता है)। संवाद मोड में एक फार्म के अपने WinForm अनुप्रयोग आग को बंद करने पर

:

आपकी समस्या यह है। वह फॉर्म एक पृष्ठभूमि कार्यकर्ता चलाता है जो दूरस्थ डीबी के साथ डीबी सिंक करता है और "स्पलैश फॉर्म" पर इसकी प्रगति प्रदर्शित करता है।

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

मैं इनमें से किसी भी का उपयोग न करने की अनुशंसा करता हूं - बस इसके बजाय myMainForm.Close() पर कॉल करें। यह आपके मुख्य रूप को बंद कर देना चाहिए, जो आपके बंद तर्क को उचित रूप से आग लगा देगा। एक बार आपके आवेदन में मुख्य रूप बंद हो जाने पर, यह शानदार ढंग से बंद हो जाएगा।

9

Environment.Exit() कंसोल ऐप्स के लिए उपयोग किया जाता है। , System.Windows.Forms.Application.Exit()

धागा बाहर निकलने से, आप केवल वर्तमान धागा संदर्भ से बाहर निकल रहा है, जबकि छोड़ने किसी भी शुरू कर दिया चल अग्रभूमि धागे:

आप उपयोग करना चाहते हैं। मुझे लगता है कि त्रुटि उत्पन्न होने वाले थ्रेड पर अभी भी चल रहा है, इसलिए आपने अनिवार्य रूप से समस्या को मुखौटा कर दिया है, इसके आसपास काम नहीं किया है। मैं कोशिश करूँगा और पता लगाऊंगा कि आपको यह त्रुटि "Collection was modified; enumeration operation may not execute." से बाहर निकलने पर क्यों मिल रही है। यह Application.Exit() द्वारा खुलासा किया जा रहा है, लेकिन यह इसके कारण नहीं है।

+1

या यदि आपको शीर्ष स्तर के त्रुटि हैंडलर में त्रुटि पकड़ने के बाद तेज़ विफल होने की आवश्यकता है, तो निश्चित रूप से लॉग इन करने के बाद, निश्चित रूप से। –

संबंधित मुद्दे