2010-08-20 17 views
5

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

समस्या यह है कि मेरा एप्लिकेशन पृष्ठभूमि धागे का उपयोग करता है, और यदि कोई अपवाद फेंक दिया गया है, तो थ्रेड्स परवाह नहीं है, कहें, जीयूआई थ्रेड (जो समझ में आता है), और बस अपना काम जारी रखें। अंततः परिणामस्वरूप एक डब्लूईआर संवाद पॉप-अप होता है यदि उपयोगकर्ता मेरी कस्टम अपवाद हैंडलर विंडो को लंबे समय तक खुला रहता है, जिससे ऐसा लगता है कि त्रुटि हैंडलर स्वयं क्रैश हो गया है।

मुझे अपवाद हैंडलर के दायरे में थ्रेड ऑब्जेक्ट तक पहुंच नहीं है, इसलिए मैं उन्हें निलंबित नहीं कर सकता। दुनिया भर में थ्रेड ऑब्जेक्ट्स को बनाना एक समाधान नहीं है। मेरे अपवाद हैंडलर में Globals.Crashed = true; जैसे कुछ का उपयोग करना है, और मेरे थ्रेड विधियों को प्रत्येक लूप पुनरावृत्ति पर उस संपत्ति की जांच करने के लिए है। सही नहीं है, लेकिन यह नुकसान को कम करता है।

क्या किसी को कम हैकी विधि पता है? क्या मेरा दृष्टिकोण गलत है? क्या मुझे ऐसा करना है जैसे WER करता है और एक बाहरी प्रोग्राम लॉन्च करता है जो मुख्य प्रोग्राम को निलंबित करता है और त्रुटि UI दिखाता है?

+0

यदि वह चाल काफी अच्छी तरह से काम करती है, तो मैं इसके साथ रहूंगा। – FrustratedWithFormsDesigner

उत्तर

5

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

एक अच्छा तरीका अलग छोटा एप्लिकेशन लिखना है जो त्रुटि रिपोर्टिंग करता है। वह एप्लिकेशन किसी फ़ाइल से रिपोर्ट करने के लिए विवरण उठा सकता है। इस तरह आपका अज्ञात अपवाद हैंडलर होगा:

  • temp निर्देशिका में फ़ाइल को जानकारी डंप करें।
  • फ़ाइल नाम के साथ त्रुटि रिपोर्टिंग ऐप को तर्क के रूप में प्रारंभ करें।
  • कुछ बेवकूफ करने से पहले असफल प्रक्रिया को समाप्त करें।

त्रुटि रिपोर्टिंग ऐप द्वारा temp फ़ाइल को हटाया जाना चाहिए।

+0

यह सर्वोत्तम दृष्टिकोण की तरह लगता है । धन्यवाद। –

0

आप अपने सभी धागे को वैश्विक संग्रह ऑब्जेक्ट में ट्रैक कर सकते हैं, ताकि जब आपका हैंडलर निष्पादित हो जाए, तो यह संग्रह ऑब्जेक्ट के माध्यम से बस फिर से हो सकता है और वहां थ्रेड को रोक सकता है।

+0

मुझे लगता है कि पिछले हफ्ते में एक चर्चा हुई थी या इस विषय पर छू गया था। मुझे देखने दो कि क्या मैं यह लिंक पा सकता हूं ... ठीक है, यहां यह है: http://stackoverflow.com/questions/3480451/time-limiting-a-method-in-c – FrustratedWithFormsDesigner

0

इस प्रश्न में कोड को देखें, Suspend Process in C#, आपको इसे बदलने की आवश्यकता होगी ताकि आपके जीयूआई थ्रेड को निलंबित न किया जा सके और जो भी पृष्ठभूमि आपने शुरू नहीं किया है, लेकिन यह चाल चलाना चाहिए ।

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

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

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