2009-03-04 10 views
19

अभी, उपयोगकर्ता मेरी अनुप्रयोग से बाहर करना चाहते हैं, मैं तो मैं निम्नलिखित है कुछ चीजें मैं करने के लिए (यानी, सर्वर से डिस्कनेक्ट उपयोगकर्ता डेटा की बचत ...) है और कार्य करें:मैं अपने WinForm एप्लिकेशन से बाहर निकलने के लिए Process.GetCurrentProcess()। Kill() का उपयोग क्यों नहीं करना चाहिए?

  • बूलियन
  • का उपयोग करके मेरे सभी मेनलोप्स से बाहर निकलें धागे अभी भी चल रहे थ्रेड को रोक दें (आमतौर पर, मेरा सर्वर मतदान थ्रेड)
  • कृपया आवेदन करें। एक्साइट();

यह बाहर निकलने के लिए कुछ ही सेकंड लेता है, और कोई वास्तविक उद्देश्य में कार्य करता (सब कुछ पहले से ही सर्वर पर सहेजा जाता है, इसलिए मैं वास्तव में परवाह नहीं है वहाँ क्या होता है)

यदि मैं यह बजाय का उपयोग करें, मैं

System.Diagnostics.Process.GetCurrentProcess().Kill(); 

क्यों मैं सिर्फ अपनी प्रक्रिया समाप्त नहीं होता और CLR AppDomain छोड़ देना: कोई दोष यह मैं के बारे में सोच सकते हैं के साथ तत्काल समाप्ति मिल गया?

मुझे पता है कि सावधानी से आपके साझा संसाधनों (आईओ फ़ाइल हैंडलर इत्यादि) का निपटान करना महत्वपूर्ण है (इसलिए कृपया इसका उत्तर न दें :)), लेकिन एक बार ऐसा करने के बाद, क्या मेरे ऐप से बाहर निकलने का कोई वास्तविक कारण है?

+1

मुझे लगता है कि किसी भी अंत में ब्लॉक को इस मामले में संसाधित नहीं किया जाएगा, जो भविष्य में अप्रत्याशित बग का कारण बन सकता है जब कोई और कोड बनाए रखता है। –

+0

@ होसम: यह एक अच्छा मुद्दा है। आप इसे उत्तर के रूप में क्यों नहीं पोस्ट करते हैं ताकि इसे ऊपर उठाया जा सके? – Brann

+0

@ ब्रैन: हो गया। सलाह के लिये धन्यवाद। –

उत्तर

4

सबसे पहले, मुझे लगता है कि आपका मतलब Process.Kill() है, Process.TerminateProcess() नहीं। दूसरा, प्रक्रिया को मारना सिर्फ इसे बाहर निकाल देगा। कोई भी क्लीनअप कोड निष्पादित नहीं होगा और आपके एप्लिकेशन को हत्या को रद्द करने का मौका नहीं मिलेगा (उदाहरण के लिए यदि उपयोगकर्ता के पास सहेजा गया डेटा है)। यदि आप इससे खुश हैं, तो इसके लिए जाएं।

+1

वास्तव में यह प्रक्रिया है। GetCurrentProcess()। Kill(); मैंने तदनुसार अपनी पोस्ट तय की। इसे ध्यान में रखने के लिए धन्यवाद! :) – Brann

4

यह वास्तव में एक अच्छा सवाल है!

एक बार एक बार (दस साल पहले) मैंने एक वेब सर्वर पर इस्तेमाल किए गए विशेष प्रमाणपत्र के कारण WinINet OCX (या जिसे भी कहा जाता था) में एक पुष्टि की गई बग के कारण समाप्त होने पर एक वीबी 6 ऐप लिखा था, बात कर रहा था

इस बग के आसपास आने के किसी भी तरीके के बिना मैंने टर्मिनेट प्रोसेस का इस्तेमाल किया और जो कुछ मुझे पता है, उसके लिए यह ऐप कई हज़ारों मशीनों पर कई वर्षों तक उपयोग में था और मैंने इस हैक के बारे में कभी भी कोई समस्या नहीं सुनी!

+0

और फिर भी मेरे पास अभी एक टेस्ट-केस है जो किल हैक के साथ विफल रहता है। यह पासा भरा हुआ है, बिल्कुल जब प्रक्रिया की मौत हो गई थी, और वास्तव में प्रक्रिया क्या कर रही थी, और वास्तव में क्या होने वाला है। यही कारण है कि डेटा लिखने/पुनः चलाने योग्यता सुनिश्चित करने के लिए एसीआईडी ​​डेटाबेस * जबरदस्त लंबाई * के माध्यम से जाते हैं - ताकि वे किसी भी समय अशिष्टता से बंद हो जाएं और डेटा न खोएं। यदि फंसे की प्रक्रिया महत्वपूर्ण डेटा (तब या बाद में) के साथ सभी को स्क्वाट कर रही थी, तो हर तरह से इसे नाक करें; यह प्रक्रिया एक्सप्लोरर के माध्यम से प्रक्रिया को मारने से वास्तव में अलग नहीं है। – user2864740

1

ध्यान रखें कि यदि आप किसी फ़ाइल/नेटवर्क स्ट्रीम पर लिख रहे हैं तो यह संभव है कि आपका लेखन अधूरा होगा।

यदि आपका आवेदन भ्रष्ट डेटा से निपटने के लिए तैयार है, तो ऐसा करने का कोई कारण नहीं है। हालांकि, अगर आप अन्य माध्यमों से बाहर निकल सकते हैं तो मैं इसकी अनुशंसा करता हूं।

12

प्रक्रिया को मारने का मतलब यह होगा कि आखिरकार ब्लॉक निष्पादित नहीं किए जाएंगे, और शायद critical finalizer objects भी नहीं, जो वास्तव में महत्वपूर्ण हो सकता है, और सिस्टम स्तर पर संसाधन रिसाव का कारण बनता है। यह भविष्य में अप्रत्याशित बग भी पैदा कर सकता है जब कोई और कोड को बनाए रखता है, क्योंकि वे (या आप) को अपने सिर मोड़ना होगा, हर बार जब वे आखिरकार लिखते हैं तो यह सोचने के लिए कि क्या इसे निष्पादित किया जाएगा।

+0

ओएस को संसाधनों को रिसाव नहीं करना चाहिए क्योंकि एक प्रक्रिया की मौत हो गई थी। लेकिन आखिर में ब्लॉक और फाइनलाइजर्स एक अच्छा मुद्दा हैं। – Qwertie

+1

@Qwertie हां, लेकिन कभी-कभी यह करता है। उदाहरण के लिए, एक एप्लिकेशन क्रैश होने के बावजूद एक कैमरा खुला छोड़ा जा सकता है। यह ड्राइवर में एक बग हो सकता है, लेकिन यह "सिस्टम" का हिस्सा भी है। –

0

System.Environment.Exit(int) का उपयोग क्यों नहीं करें? ऐसा लगता है कि आप कोड को बचाने के लिए ऐसा करना चाहते हैं। मेरे लिए बाहर निकलने के लिए कॉल देखने के लिए यह बहुत स्पष्ट है और आपका शट डाउन अधिक नियंत्रित होगा, फाइनलाइजर्स और क्रिटिकल फ़ाइनलाइजर्स चलेंगे।

+0

पर्यावरण। एक्सिट (int) अंतर्निहित ऐपडोमेन या देशी कोड फ़ंक्शन के WER/ReportFault परिवार में कूदने के मामले में बाहर निकलने की गारंटी नहीं देता है। यहां तक ​​कि किल() भी समाप्ति गारंटी नहीं है क्योंकि कर्नेल-स्तरीय डेडलॉक प्रक्रिया को छोड़ने से रोक देगा, लेकिन आमतौर पर किल को तुरंत समाप्त कर दिया जाता है, जबकि बाहर निकलने के लिए प्रोग्राम को क्लीनअप की अनुमति मिलती है। –

1

यह ध्यान दिया जाना चाहिए कि finalizers may actually be never executed, इसलिए प्रक्रिया को मारना किसी भी अन्य कारण से अंतिमकरण कोड को छोड़ने के लिए बहुत अलग नहीं है, जैसे धीमा अंतिमकर्ता या एक अपवाद फेंकने वाला फाइनलाइज़र।

सब कुछ, मैं कुछ सेकंड लेने के आवेदन को बंद करने के बारे में ज्यादा चिंता नहीं करता, खासकर अगर यह तुरंत अपनी सभी खिड़कियों को छुपाता है और उपयोगकर्ता के लिए "गायब हो जाता है"। हालांकि, अगर बंद होने में दर्जनों सेकंड लगते हैं और/या उपयोगकर्ता फिर से एप्लिकेशन निष्पादित करने की संभावना रखते हैं और यह कई उदाहरणों का समर्थन नहीं करता है, तो Process.Kill पर कॉल करना एक अच्छा विचार हो सकता है।

मैं कुछ अनुप्रयोगों जो उम्र ले समाप्त करने के लिए पता है, और मैं उन्हें एक दिन देखने के लिए सिर्फ बेरहमी से खुद को मौत हो गई बजाय बनाने मुझे, उपयोगकर्ता उम्मीद है, यह कर (यह विशेष रूप से ओएस पुनः आरंभ करने पर कष्टप्रद है)।

1

तृतीय पक्ष पुस्तकालयों का उपयोग करके उनकी त्रुटियों या रिसावों को पकड़ने के लिए कोई रास्ता नहीं है, कभी-कभी क्रैश संदेशबॉक्स को फेंकने के बिना इसे समाप्त करने का एकमात्र तरीका प्रक्रिया को मारना है।

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