2009-12-09 9 views
20

VS2008, .नेट 2, VB.NET, XP ...वेबब्राउज़र नियंत्रण के साथ फ़ॉर्म बंद करते समय एक RaceOnRCWCleanup त्रुटि क्यों?

मैं एक WebBrowser नियंत्रण और एक बंद करें बटन है, जो सिर्फ एक Me.Close करता है के साथ एक Windows फ़ॉर्म दिया गया है। फॉर्म का रद्द बटन बंद बटन पर सेट है, ताकि मैं फॉर्म को बंद करने के लिए ईएससी को हिट कर सकूं।

मैंने लोड ईवेंट में वेबब्रोसर नियंत्रण की DocumentText संपत्ति सेट की है, और HTML डिस्प्ले।

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

अगर मैं ESC बटन हिट मैं

RaceOnRCWCleanup का पता चला था संदेश: एक प्रयास मुक्त एक RCW उपयोग में है कि करने के लिए किया गया है। आरसीडब्ल्यू सक्रिय धागे या अन्य धागे पर उपयोग में है। उपयोग में आने वाले को मुक्त करने का प्रयास आरसीडब्ल्यू भ्रष्टाचार या डेटा हानि का कारण बन सकता है।

यदि मैं वीएस के बाहर ऐप चलाता हूं, तो मुझे कोई त्रुटि नहीं मिलती है।

कोई विचार ए) क्यों त्रुटि, और बी) इसे कैसे रोकें या दबाएं?

अग्रिम में बहुत धन्यवाद।

उत्तर

30

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

क्या आप हैं? यदि नहीं, तो इस पर कोई नींद न खोएं। COM संदर्भ गणना का उपयोग करता है, परिपत्र संदर्भों को हल करने में सक्षम नहीं होने के लिए कुख्यात।


ठीक है, मुझे टिप्पणियों द्वारा सक्षम इस के लिए एक रेपो मिला है। हां, यह फ़ॉर्म की CancelButton संपत्ति या बटन की DialogResult संपत्ति द्वारा ट्रिगर किया गया है। ऐसा तब होता है जब डब्लूबीबी का ध्यान केंद्रित होता है, यह एस्केप कुंजी प्रेस देखता है। ActiveX नलसाजी का हिस्सा कंटेनर को इसके बारे में बताने के लिए है ताकि यह कीस्ट्रोक का जवाब दे सके जो दुष्प्रभाव हो। शॉर्टकट कीस्ट्रोक, टैब, एंटर करें। और भागो। यदि बटन फॉर्म को बंद कर देता है, तो डीबगर डब्लूबीबी को डिस्प्ले पर देखता है जबकि स्टैक पर आरसीडब्ल्यू कोड से सक्रिय स्टैक फ्रेम होते हैं। खतरा यह है कि जब COM घटक जारी होने के बाद बुलाया गया कोड लौटाता है तो यह एक क्रैश हो सकता है, यह असामान्य नहीं है।

इस दुर्घटना को देखना बहुत ही असंभव है, लेकिन मैं कल्पना कर सकता हूं कि यह अंतिम बार थ्रेड बटन के क्लिक ईवेंट के ठीक पहले चलता है जब यह बम हो सकता है। एमडीए और संभावित दुर्घटना के लिए कामकाज फॉर्म को बंद करने में देरी करना है जब तक ActiveX कोड चलना बंद नहीं हो जाता है। नियंत्रण के साथ सुंदर ढंग से किया। BginginInvoke()। इस तरह:

private void CancelButton_Click(object sender, EventArgs e) { 
     this.BeginInvoke((MethodInvoker)delegate { this.Close(); }); 
    } 
+2

नहीं, यह सब अग्रभूमि धागे पर हो रहा है। यह तथ्य नहीं है कि यह सब मुझे परेशान करता है - वीएस में उन्हें बंद करने के तरीके हैं।यह तथ्य यह है कि अगर बंद ईवेंट हैंडलर को बंद बटन पर क्लिक करके बुलाया जाता है, तो यह * नहीं होता है, लेकिन यदि एक ही हैंडलर ईएससी को मारकर बुलाया जाता है (क्योंकि बंद बटन फॉर्म की रद्द करें बटन प्रॉपर्टी है), यह * कर देता है*। अंतर क्यों? – ChrisA

+2

मैं यह सटीक परिदृश्य देख रहा हूं .. यह मेरे लिए कोई समस्या नहीं है, क्योंकि मैं इस पर वेब ब्राउजर के साथ फ़ॉर्म को बंद करना चाहता हूं। मैं समझना चाहता हूं कि ईएससी दबाकर और 'एक्स' पर क्लिक करने में अंतर क्यों है। – mpeterson

+0

@ क्रिस, @mpeterson - एक repro और एक समाधान मिला, अद्यतन पोस्ट। –

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