2010-02-08 16 views
5

मैं एक कार्यक्रम है कि मैं चलाने के लिए और बीच में मैं यह संदेश प्राप्त के बारे में अजीब संदेश \ मेरे दस्तावेज़ \ स्कूलस्टफ \ आईआर सूचना \ होम वर्क \ FianlProject \ finalProject \ finalProject \ bin \ Debug \ finalProject.vshost.exe '। अतिरिक्त जानकारी: सीएलआर COM संदर्भ 0x3407968 से 60 सेकंड के लिए COM संदर्भ 0x3407ad8 में संक्रमण करने में असमर्थ रहा है। गंतव्य संदर्भ/अपार्टमेंट का स्वामित्व वाला धागा संभवतः एक गैर पंपिंग प्रतीक्षा कर रहा है या विंडोज संदेशों को पंप किए बिना बहुत लंबे समय तक चलने वाले ऑपरेशन को संसाधित कर रहा है। इस स्थिति में आम तौर पर नकारात्मक प्रदर्शन प्रभाव होता है और यह भी समय के साथ लगातार गैर-प्रतिक्रियाशील या मेमोरी उपयोग जमा हो रहा है। इस समस्या से बचने के लिए, सभी एकल थ्रेडेड अपार्टमेंट (एसटीए) थ्रेडों को पंपिंग प्रतीक्षा प्राइमेटिव्स (जैसे CoWaitForMultipleHandles) का उपयोग करना चाहिए और नियमित रूप से लंबे समय तक चलने वाले संचालन के दौरान संदेशों को पंप करना चाहिए।सी # में धागे

मैं समझता हूं कि इस तथ्य के साथ कुछ करने के लिए यह है कि यह बिना किसी रोक या 60 सेकंड के लिए चलता है? यह एक समस्या कैसे है? मैंने अपने प्रोग्राम के मुख्य से पहले [STAThread] भी रखा क्योंकि अगर मैं इसे हटा देता हूं तो यह मुझे यह संदेश दिखाता है:

सिस्टम 'थ्रेडिंग। थ्रेडस्टेट एक्सेप्शन' का एक अनचाहे अपवाद System.Windows.Forms.dll में हुआ। अतिरिक्त जानकारी: ओएलई कॉल किए जाने से पहले वर्तमान धागा एकल थ्रेड अपार्टमेंट (एसटीए) मोड पर सेट किया जाना चाहिए। सुनिश्चित करें कि आपके मुख्य फ़ंक्शन में STATHreadAttribute चिह्नित है। यह अपवाद केवल तब उठाया जाता है जब प्रक्रिया से डीबगर संलग्न होता है।

कोई भी जानता है कि मैं इस समस्या को कैसे हल कर सकता हूं?

अग्रिम धन्यवाद,

लीना

उत्तर

1

यह एक चेतावनी है जो उत्पन्न होता है जब आप पृष्ठभूमि थ्रेड से ActiveX ऑब्जेक्ट पर कॉल करते हैं और आपका मुख्य थ्रेड अवरुद्ध होता है। शायद अधिक संभावना: विजुअल स्टूडियो 2005 के खुदरा संस्करण में एक बग था जिसने इस चेतावनी को किसी भी अच्छे कारण से नहीं छोड़ा। यह सर्विस पैक 1 में तय हो गया है, सुनिश्चित करें कि आपने इंस्टॉल किया है। फिर भी एक और कामकाज इसे बंद करना है। डीबग + अपवाद, प्रबंधित डिबगिंग सहायक, ContextSwitchDeadlock चेतावनी को अनचेक करें। लेकिन अगर आपके पास यह नहीं है तो एसपी 1 का उपयोग करें।

+0

यदि मैं संदर्भ स्विच डेडलॉक बंद करता हूं, तो क्या इससे कोई नुकसान हो सकता है? मैं विजुअल स्टूडियो 2008 का उपयोग कर रहा हूं .. –

+0

कुछ भी उड़ने वाला नहीं है। आप वास्तव में एक डेडलॉक हो सकता है। आप जल्दी से पता लगाएंगे, आपका प्रोग्राम स्थिर हो जाएगा। –

2

आप सुनिश्चित करें कि आपके धागा कि COM घटक का मालिक नहीं किया जा रहा> 60 सेकंड के लिए "बंद" है प्रसंस्करण के माध्यम से करने की जरूरत है।

शायद यह हो रहा है कि आपके पास एक COM ऑब्जेक्ट है, और आप UI थ्रेड पर काम कर रहे हैं। यदि आपका यूआई 60 सेकंड के लिए प्रसंस्करण द्वारा अवरुद्ध हो जाता है, तो COM घटक शिकायत कर सकता है।

अपनी लंबी चल रही प्रक्रिया को संभालने के लिए BackgroundWorker उदाहरण का उपयोग करने पर विचार करें। यह काम को पृष्ठभूमि थ्रेड पर धक्का देगा, और COM घटक को शिकायतों के बिना संदेशों को संसाधित करने की अनुमति देगा।

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