विजुअल स्टूडियो: कॉन्टेक्स्टस्विचडीडलॉक


167

मुझे एक त्रुटि संदेश मिल रहा है जिसे मैं हल नहीं कर सकता। यह Visual Studio या डीबगर से उत्पन्न होता है। मुझे यकीन नहीं है कि परम त्रुटि की स्थिति वीएस, डिबगर, मेरे कार्यक्रम या डेटाबेस में है।

यह एक विंडोज ऐप है। वेब ऐप नहीं।

VS का पहला संदेश एक पॉपअप बॉक्स है, जिसमें कहा गया है: "किसी भी कॉल स्टैक फ़्रेम के लिए कोई प्रतीक लोड नहीं किए गए हैं। स्रोत कोड प्रदर्शित नहीं किया जा सकता है।" जब उस पर क्लिक किया जाता है, तो मुझे मिलता है: " ContextSwitchDeadlock का पता लगाया गया ", साथ ही नीचे एक लंबे संदेश को पुन: प्रस्तुत किया गया।

एक लूप में त्रुटि उत्पन्न होती है जो डेटाटेबल को स्कैन करती है। प्रत्येक पंक्ति के लिए, यह SqlCommand के पैरामीटर के रूप में तालिका से एक कुंजी (HIC #) मान का उपयोग करता है। SqlDataReader बनाने के लिए कमांड का उपयोग किया जाता है जो एक लाइन को लौटाता है। डेटा की तुलना की जाती है। यदि एक त्रुटि का पता चला है एक पंक्ति एक दूसरे DataTable में जोड़ा जाता है।

त्रुटि से संबंधित लगता है कि प्रक्रिया को चलाने में कितना समय लगता है (अर्थात 60 सेकंड के बाद), न जाने कितनी त्रुटियां पाई जाती हैं। मुझे नहीं लगता कि यह एक स्मृति मुद्दा है। लूप के भीतर कोई चर घोषित नहीं किए जाते हैं। बनाई गई एकमात्र ऑब्जेक्ट SqlDataReaders हैं, और वे संरचनाओं का उपयोग कर रहे हैं। जोड़ें System.GC.Collect () का कोई प्रभाव नहीं था।

डीबी एक ही लैपटॉप पर एक SqlServer साइट है।

फॉर्म पर कोई फैंसी गिज़्म या गैजेट नहीं हैं।

मुझे इस प्रॉप में कुछ भी पता नहीं है, जो मैंने पहले दर्जनों बार किया है, उससे बहुत अलग है। मैंने पहले भी त्रुटि देखी है, लेकिन लगातार आधार पर नहीं।

कोई विचार, कोई भी?

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

जवाबों:


287

ContextSwitchDeadlockआवश्यक रूप से अपने कोड एक मुद्दा है, एक संभावित है सिर्फ इतना है कि वहाँ मतलब यह नहीं है। यदि आप Debug > Exceptionsमेनू में जाते हैं और विस्तार करते हैं Managed Debugging Assistants, तो आप पाएंगे कि ContextSwitchDeadlockयह सक्षम है। यदि आप इसे अक्षम करते हैं, तो जब आइटम संसाधित होने में लंबा समय ले रहे हों, तो VS आपको चेतावनी नहीं देगा। कुछ मामलों में आपके पास वैध रूप से लंबे समय तक चलने वाला ऑपरेशन हो सकता है। यदि आप डिबगिंग कर रहे हैं और यह प्रोसेसिंग करते समय एक लाइन पर रुक गया है तो भी यह मददगार है - आप नहीं चाहते कि इससे पहले कि आपको किसी मुद्दे पर खुदाई करने का मौका मिले, शिकायत करें।


4
सही पर! धन्यवाद। मुझे कस्टमाइज़ करने और डिबग मेनू में अपवाद जोड़ने के लिए जाना था। UI का सबसे सहज पहलू नहीं है। टूल्स \ अनुकूलित करें, फिर पुनर्व्यवस्थित कमांड्स (बटन), फिर ऊपरी दाईं ओर ड्रॉप-डाउन से डीबग का चयन करें, फिर जोड़ें (बटन)। वाह!
सीजड्राइव

81
ctrl-alt-eअपवाद संवाद लाता है।
फ्लोरियन डॉयोन

1
विजुअल स्टूडियो (2012, 2010, 2008) के कुछ और हालिया संस्करणों में से कुछ और संभवतः कुछ पहले वाले, किसी एक को विजुअल स्टूडियो के प्राथमिक उपयोग को चुनने की अनुमति देते हैं जब यह स्थापना के बाद पहली बार चलता है। यह विकल्प टूलबार के डिफ़ॉल्ट लेआउट को निर्धारित करता है, जिसमें नियंत्रण दिखाई या छिपा हुआ है, और यहां तक ​​कि कीस्ट्रोक किस कमांड के अनुरूप हैं। वीएस 2010 में, आयात और निर्यात सेटिंग्स विज़ार्ड आपको उपलब्ध डिफॉल्ट में से किसी एक पर रीसेट करने की अनुमति देता है।
ज़ेरेफ़ेथ

4
@ B.ClayShannon - कॉन्टेक्स्टस्विचडीडलॉक डीबगर के लिए विशिष्ट है। निर्वासन का एक रिलीज़ संस्करण इस संदेश को प्रदर्शित नहीं करेगा।
पेड्रो

9
वीएस 2013 में साथ नेविगेट करें Debug -> Windows -> Exceptions Settings। फिर
मार्कस वेबर

16

जैसा कि पेड्रो ने कहा, आपके पास डिबगर के साथ संदेश पंप को रोकने के साथ एक समस्या है यदि आप कोड के माध्यम से कदम रख रहे हैं।

लेकिन अगर आप UI थ्रेड पर एक लंबे समय तक चलने वाला ऑपरेशन कर रहे हैं, तो Application.DoEvents () को कॉल करें जो स्पष्ट रूप से संदेश कतार को पंप करता है और फिर आपके वर्तमान तरीके पर नियंत्रण लौटाता है।

हालाँकि यदि आप ऐसा कर रहे हैं तो मैं आपके डिज़ाइन को देखने की सलाह दूंगा ताकि आप UI थ्रेड को संसाधित कर सकें ताकि आपका UI अच्छा बना रहे।


14

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

आपको लंबे समय तक चलने वाले ऑपरेशन के लिए एक बैकग्राउंड थ्रेड को देखना चाहिए और ऐसा होने पर उपयोगकर्ता के लिए "मैं व्यस्त हूं" डायलॉग के कुछ प्रकार डाल रहा हूं।


13

Visual Studio 2017 में, ContextSwitchDeadlock विकल्प को अनचेक किया गया:

डीबग> विंडोज> अपवाद सेटिंग्स

यहां छवि विवरण दर्ज करें

Windows की स्थापना में अपवाद: ContextSwitchDeadlock विकल्प को अनचेक करें

यहां छवि विवरण दर्ज करें


9

यदि आप इस अपवाद को अक्षम नहीं करना चाहते हैं, तो आपको बस इतना करना है कि अपने आवेदन को हर 60 सेकंड में कम से कम एक बार कुछ संदेश पंप करने दें। यह इस अपवाद को रोकने के लिए होगा। System.Threading.Thread.CurrentThread.Join (10) को एक बार कॉल करने का प्रयास करें। अन्य कॉल हैं जो आप कर सकते हैं कि संदेशों को पंप करें।


क्या आप बता सकते हैं कि यह मदद क्यों करता है?
रोल

यह काम नहीं करेगा, मेरे पास UI अपडेट करने वाला एक लूप है और अभी भी त्रुटि संदेश मिलता है।
htm11h

1
10 मिलीसेकंड के मान का उपयोग करने की कोई आवश्यकता नहीं है, वास्तव में यदि आप इसे लंबे समय तक चलने वाले ऑपरेशन में दोहराव से बुलाने का इरादा रखते हैं, तो इससे समग्र प्रदर्शन (कुल समय निष्पादन) बहुत कम हो जाएगा। बस शून्य को पास करो।
इलेक्ट्रोस्टूडिओस 14

मुझे भी ऐसी ही समस्या थी। काम करने के लिए अपने समाधान मिला। धन्यवाद!
स्की शाहनवाज़-उल हक

2

उपरोक्त समाधान कुछ परिदृश्यों में अच्छा है, लेकिन एक और परिदृश्य है जहां यह तब होता है जब आप इकाई परीक्षण कर रहे होते हैं और जब आप समाधान डीबग करने के लिए सेट नहीं होते हैं, तो आप टेस्ट एक्सप्लोरर से "डीबग चयनित टेस्ट" का प्रयास करते हैं।

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

मुझे यह स्वयं याद आया क्योंकि त्रुटि संदेश बहुत बुरा था क्योंकि मैंने उस स्पष्ट चीज़ की जांच नहीं की थी जो डीबग सेटिंग थी!


1

दृश्य स्टूडियो 2017 स्पेनिश संस्करण में।

"डिपुरार" -> "वेंटनस" -> "कॉन्फिगरिसोन डी एक्ससेपियोनीस"

और "ContextSwitchDeadlock" खोजें। फिर, इसे अनचेक करें। या शॉर्टकट

Ctrl + डी, ई

श्रेष्ठ।


0

आप इसे से संदर्भों को अनचेक करके हल कर सकते हैं

डीबग-> अपवाद ... -> विस्तृत करें MDA नोड -> अनचेक करें -> contextswitchdeadlock


0

मुझे यह त्रुटि मिल रही थी और प्रश्नों को बदलकर async (प्रतीक्षित (...)। ToListAsync ()) कर दिया। अभी सब अच्छा है।

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