ContextSwitchDeadlock C # में त्रुटि का पता चला था


80

मैं एक C # एप्लिकेशन चला रहा हूं, और रन-टाइम के दौरान मुझे निम्नलिखित त्रुटि मिलती है:

CLR COM संदर्भ 0x20e480 से COM संदर्भ 0x20e5f0 60 सेकंड के लिए संक्रमण करने में असमर्थ रहा है। गंतव्य संदर्भ / अपार्टमेंट का मालिक होने वाला धागा सबसे अधिक संभावना है कि या तो एक गैर पंपिंग प्रतीक्षा कर रहा है या विंडोज संदेशों को पंप किए बिना बहुत लंबे समय तक चलने वाले संचालन को संसाधित करता है। इस स्थिति का आम तौर पर नकारात्मक प्रदर्शन प्रभाव पड़ता है और यह समय के साथ लगातार गैर संवेदी या स्मृति उपयोग के रूप में जमा होते जा रहा है। इस समस्या से बचने के लिए, सभी एकल थ्रेडेड अपार्टमेंट (एसटीए) थ्रेड्स को लंबे समय तक चलने वाले संचालन के दौरान पम्पिंग वेट प्राइमेटिव्स (जैसे कॉवेटफॉर मॉल्टलेंटहैंडल्स) और नियमित रूप से पंप संदेशों का उपयोग करना चाहिए।

किसी को भी कृपया यहाँ समस्या के साथ मेरी मदद कर सकते हैं?

बहुत बहुत धन्यवाद।

जवाबों:


123

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

यह आसानी से दिखाई देनी चाहिए, आपका यूआई डोर नेल के रूप में मृत होना चाहिए। विंडोज को आपकी मुख्य विंडो को एक भूत के साथ बदलना चाहिए था जो "नॉट रिस्पॉन्सिंग" प्रदर्शित करता है। विंडो बंद करने से काम नहीं चलेगा, क्लिक की घटनाओं का कोई प्रभाव नहीं पड़ेगा।

आपके मुख्य सूत्र जो कुछ भी कर रहे हैं, उसके बजाय एक श्रमिक सूत्र द्वारा किया जाना चाहिए। BackgroundWorkerवर्ग के लिए, आप इसके लिए MSDN लाइब्रेरी लेख में कई उपयोग मदद मिल जाएगा अच्छा है। डीबग + ब्रेक ऑल, डीबग + विंडोज + थ्रेड्स का उपयोग करें यदि आपको पता नहीं है कि मुख्य धागा क्या कर रहा है।

एक और संभावित कारण: यदि आप VS2005 के RTM संस्करण का उपयोग कर रहे हैं, तो सर्विस पैक 1 स्थापित करना सुनिश्चित करें।


5
+1 यह समझाने के लिए कि इस तरह के कार्य आइटम को एक माध्यमिक धागे में स्थानांतरित किया जाना चाहिए, इस प्रकार इस त्रुटि से बचने के लिए समाधान (बजाय सिर्फ त्रुटि पैदा करता है)।
येल्टन

2
दिलचस्प है कि मैंने कुछ अन्य इन-हाउस निर्मित अनुप्रयोगों को देखा है, जो मेरे मुकाबले बहुत लंबे समय तक लटका हुआ है, फिर भी मैंने इस त्रुटि संदेश को हिट किया, हम्म।
Coops

MSDN दस्तावेज़ीकरण: संदर्भSwitchDeadlock MDA msdn.microsoft.com/en-us/library/ms172233%28v=vs.110%29.aspx
D_Bester

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

50

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

  1. त्रुटि को पुन: उत्पन्न करें। इसमें कुछ परीक्षण और त्रुटि शामिल हो सकते हैं।
  2. प्रबंधित डिबगिंग सहायक में 'जारी रखें' के बजाय 'ठीक' पर क्लिक करें जो प्रदर्शित होता है।
  3. सुनिश्चित करें कि टूलबार डॉकिंग क्षेत्र पर राइट क्लिक करके और 'डीबग स्थान' का चयन करके डीबग स्थान टूलबार सक्रिय है। सक्रिय होने पर आपको टूलबार में 'थ्रेड' लेबल वाली ड्रॉप डाउन सूची देखनी चाहिए।
  4. थ्रेड ड्रॉप डाउन सूची में चयनित आइटम मुख्य धागे के अलावा एक धागा होना चाहिए क्योंकि यह एक पृष्ठभूमि धागा होगा जो शिकायत कर रहा है कि मुख्य धागा सभी का ध्यान आकर्षित कर रहा है। ड्रॉप डाउन सूची में मुख्य सूत्र का चयन करें।
  5. अब आपको उस कोड को देखना चाहिए जो कोड संपादक में संदर्भ स्विच को अवरुद्ध कर रहा है।

यह मानते हुए कि आप अपने मुख्य धागे से संसाधन गहन संचालन को आगे बढ़ाने का निर्णय लेते हैं - इससे पहले कि आप कुछ अन्य उत्तरों और टिप्पणियों पर एक नज़र डालें - आपके पास प्रबंधित डीबगिंग सहायकों को अक्षम करने के लिए निम्न विकल्प हैं।

विजुअल स्टूडियो डीबगर के भीतर

  1. आप एमडीए संवाद में सीधे एमडीए को अक्षम कर सकते हैं जो कि तब प्रदर्शित होता है जब त्रुटि 'अनियंत्रित होने पर इस अपवाद प्रकार को फेंक दिया जाता है'।
  2. MSDN से नीचे दिए गए निर्देशों का उपयोग करके अपवाद सेटिंग संवाद के साथ ।

... डीबग मेनू पर, अपवाद पर क्लिक करें। (यदि डीबग मेनू में अपवाद आदेश नहीं है, तो इसे जोड़ने के लिए उपकरण मेनू पर कस्टमाइज़ करें पर क्लिक करें।) अपवाद संवाद बॉक्स में, प्रबंधित डीबगिंग सहायक सूची का विस्तार करें, और उसके बाद अलग-अलग MDA के लिए Thrown चेक बॉक्स साफ़ करें।

दृश्य स्टूडियो डीबगर के बाहर

  1. रजिस्ट्री कुंजी (मशीन वाइड, सभी MDAs प्रभावित)
  2. पर्यावरण चर (मशीन वाइड, MDAs निर्दिष्ट किया जा सकता है)
  3. एप्लिकेशन कॉन्फ़िगरेशन सेटिंग्स (एप्लिकेशन स्कोप, MDAs निर्दिष्ट किया जा सकता है)

नोट: पहले दो विकल्पों में से एक को किसी भी प्रभाव के लिए तीसरे के लिए 1 पर सेट किया जाना चाहिए।

मेरे मामले में, समस्या कंसोल एप्लिकेशन के भीतर इकाई फ्रेमवर्क में ObjectContext.SaveChanges () के लिए एक कॉल थी । साथ MTAThreadAttribute के लिए लागू Main()विधि ContextSwitchDeadlock अपवाद नहीं रह उठाया गया था । मैं दुर्भाग्य से इस परिवर्तन के पूर्ण प्रभावों के बारे में अनिश्चित हूँ।


2
कोड को खोजने पर स्पष्ट स्पष्टीकरण के लिए upvote जो प्रक्रिया को अवरुद्ध करता है।
गिलियूम शूर्मन्स

10

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

वास्तव में यह पता लगाने के लिए कि आपको डिबगर में तोड़ने और सभी थ्रेड्स को देखने और वे क्या कर रहे हैं।


4

कुछ मामलों में:
डीबग -> अपवाद -> प्रबंधित डिबग सहायक
और संदर्भ टेक्स्टविंडलॉक आइटम को अनचेक करना।


5
हां, लेकिन जब आप एक परीक्षा को बंद कर रहे हैं और यह आपके रास्ते में हो जाता है, तो इसे निष्क्रिय करने में सक्षम होना अच्छा है।
टॉड

4
कोई गलत नहीं। यह समस्या का समाधान नहीं है।
टॉम डब्ल्यू

3
आपको लगता है कि एक इंजीनियर की तरह एक वैज्ञानिक नहीं है !!
एहसान जरगर इरशादी

4
@ ईशान इरशादी, एक अच्छा इंजीनियर समस्याओं का अनुमान लगाता है और उसे ठीक करता है, उसे कालीन के नीचे न धकेलें!
एमओ पटेल

4
जबरदस्त हंसी। यदि आप त्रुटि नहीं देखना चाहते हैं, तो आप अपने मॉनिटर के अलावा कहीं और देख सकते हैं। आपके "समाधान" के साथ भी यही दृष्टिकोण है। यह कोई हल नहीं है। यह सिर्फ IGNORING है!
जिज्ञासु बोय

0

बस दृश्य स्टूडियो 2005 विंडो में डीबग मेनू से अपवादों का चयन करें, एडसेप्शन डायलॉग बॉक्स wil popup, प्रबंधित डिबगिंग असिस्टेंट्स एक्सेप्शन नोड का चयन करें, फिर ContextSwitchDeadlock चुनें और थ्रोन कॉलम का चयन हटा दें। यह बनाम को ContextSwitchDeadlock अपवाद को फेंकने से रोक देगा।

उम्मीद है की यह मदद करेगा..


60
आपकी बांह में आग लगी है। बस तंत्रिका को काटने के लिए चाकू का उपयोग करें जो आपके मस्तिष्क को दर्द भेजता है। यह आपको सूचित करेगा कि आपकी बांह में आग लगी है।
ओझा

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

0

मैं इस मुद्दे पर भाग गया जब मैं यह जानने की कोशिश कर रहा था कि मेरा OracleDataReaderअपवाद क्यों फेंक रहा था । मैंने सोचा था कि यह इसलिए असाइन किया गया था क्योंकि nullअपवाद एक पैरामीटर से संबंधित था जो `अशक्त था। तो मैंने किया:

while (dr.Read())
{
    while (dr != null)  // <-- added this line
    {
      ...

drयह कभी- कभार बंद हो गया था और इसलिए लूप सिर्फ और सिर्फ इस संदेश के आने तक ही चालू रहा, और कुछ और क्योंकि आप "जारी रखें" पर क्लिक करके इसे तब तक चालू रख सकते हैं जब तक कि आप मेमोरी से बाहर न निकल जाएं (ऐसा न करें - इसके बजाय "ओके" पर क्लिक करें। तो कहानी का नैतिक, मेमोरी लीक की तलाश करें जो डेटाबेस से मेमोरी में छोरों से अनंत तक डेटा स्ट्रीमिंग कर रहे हैं। त्रुटि वास्तव में आपको एक बुरे परिदृश्य की चेतावनी देने की कोशिश कर रही है। इसके लिए सबसे अच्छा है।


0

यह त्रुटि मेरे लिए कई बार सामने आई, और मैंने इसे एक पुनरावृत्ति के लिए नीचे ला दिया DataGridViewRow, जिसमें मैंने चेकबॉक्स मान को सही पर सेट किया। चूंकि मैं डिबग मोड में चल रहा था, इसलिए मेरे पास जारी रखने का विकल्प था, इसलिए मैं ऐसा करने में सक्षम था।

मुझे उम्मीद है इससे किसी को सहायता मिलेगी।


0

मान लें कि आप Visual Studio का उपयोग कर रहे हैं, तो आप Ctrl+Alt+Eवर्तमान प्रोजेक्ट में क्लिक कर सकते हैं और कुछ चुनिंदा प्रबंधित डिबगिंग असिस्टेंट के साथ अपवाद विंडो प्रदर्शित होगी जिसे आपको "ContextSwitchDeadlock" विकल्प को अनचेक करना चाहिए। फिर एक वर्तमान परियोजना का निर्माण।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.