2010-10-19 12 views
20

में एक्सई चलाने के दौरान क्रॉस थ्रेड ऑपरेशन अपवाद क्यों नहीं फेंक दिया गया है, मैं एक एप्लिकेशन को डिबग कर रहा था और कहीं भी कोड में, थ्रेड किसी अन्य थ्रेड द्वारा बनाए गए सूची बॉक्स तक पहुंचने का प्रयास करता है। सूची बॉक्स तक पहुंचने के प्रयास पर, एप्लिकेशन "क्रॉस-थ्रेड ऑपरेशन मान्य नहीं है: नियंत्रण 'सूची बॉक्स' डिबगिंग के दौरान अपवाद पर बनाए गए थ्रेड के अलावा किसी थ्रेड से एक्सेस किया गया है। हालांकि, जब मैं इस एप्लिकेशन के आउटपुट को bin \ Debug फ़ोल्डर में चलाता हूं, तो मुझे अपवाद संवाद नहीं मिलता है और मैं देख सकता हूं कि सूची बॉक्स को गैर-मालिक धागे से सफलतापूर्वक एक्सेस किया गया है, इसलिए इससे मुझे लगता है कि यहां एक व्यवहारिक अंतर है , सिर्फ एक दबाए गए अपवाद नहीं। मैं form_load इवेंटबिन डीबग

Control.CheckForIllegalCrossThreadCalls = false; 

पर निम्न पंक्ति के साथ डिबगिंग में इस अपवाद को पार कर सकता हूं लेकिन इस अलग व्यवहार के पीछे क्या कारण है?

उत्तर

36

हां, यह केवल तब जांच किया जाता है जब डीबगर संलग्न होता है। यह आवश्यक था क्योंकि बहुत सारे .NET 1.x कोड के इस नियम का उल्लंघन किया गया था। यह एक स्पष्ट नहीं है।

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

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

static Control() 
{ 
    //... 
    checkForIllegalCrossThreadCalls = Debugger.IsAttached; 
    //... 
} 
:

संदर्भ के लिए, प्रासंगिक कोड नियंत्रण वर्ग के स्थिर निर्माता में मौजूद है

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