2008-08-13 9 views

उत्तर

10

क्योंकि आप आसानी से डेडलॉक (अन्य मुद्दों के साथ) के साथ समाप्त हो सकते हैं।

exmaple के लिए, आपका माध्यमिक धागा यूआई नियंत्रण को अपडेट करने का प्रयास कर रहा है, लेकिन यूआई नियंत्रण द्वितीयक थ्रेड द्वारा लॉक किए गए संसाधन के लिए इंतजार कर रहा है, इसलिए दोनों धागे एक दूसरे के लिए इंतजार कर रहे हैं। जैसा कि अन्य ने टिप्पणी की है कि यह स्थिति यूआई कोड के लिए अद्वितीय नहीं है, लेकिन यह विशेष रूप से आम है।

सी ++ जैसी अन्य भाषाओं में आप कोशिश करने और ऐसा करने के लिए स्वतंत्र हैं (बिना किसी अपवाद के WinForms के रूप में फेंक दिया जा सकता है), लेकिन आपका एप्लिकेशन फ्रीज हो सकता है और प्रतिक्रिया देना बंद कर देना चाहिए।

संयोग से, आप यूआई थ्रेड को आसानी से बता सकते हैं कि आप एक नियंत्रण को अपडेट करना चाहते हैं, बस एक प्रतिनिधि बनाएं, फिर उस प्रतिनिधि पर (एसिंक्रोनस) BeginInvoke विधि को अपने प्रतिनिधि को पास कर दें। जैसे

myControl.BeginInvoke(myControl.UpdateFunction); 

इस में 1.0/1.1 कोई अपवाद नहीं एक कार्यकर्ता धागे से एक सी ++/MFC PostMessage कर

+3

मुझे यकीन नहीं है कि यह उत्तर क्यों स्वीकार किया गया था। यह बस सही जवाब नहीं है। जब भी आपके पास एकाधिक धागे होते हैं तो डेडलॉक्स हो सकते हैं। जीयूआई कार्यक्रमों में निहित कुछ भी नहीं है जो उन्हें होने की अधिक संभावना बनाता है। इसके अलावा, अगर आप BeginInvoke() का उपयोग करते हैं तो भी वे आसानी से हो सकते हैं। ब्रायन एनसिंक का जवाब सही है। – mhenry1384

+1

-1: लॉक संसाधनों की प्रतीक्षा समस्या नहीं है। समस्या दौड़ की स्थिति है, जो कि किसी भी कोड में बड़ी मात्रा में मौजूद है जिसे बहु-थ्रेडेड वातावरण में उपयोग करने के लिए डिज़ाइन नहीं किया गया था। आप इसे [चेकफोर इलगैलल क्रॉस थ्रेडकॉल] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.checkforillegalcrossthreadcalls (VS.80) .aspx) को सेट करके भी जांच सकते हैं, झूठ बोलने के लिए, और डेडलॉक का निरीक्षण करें मुक्त ऑपरेशन, जब तक कुछ मजेदार होता है। –

1

ऐसा इसलिए है कि आपके पास एक ही समय में नियंत्रण को अपडेट करने की कोशिश करने वाली दो चीजें नहीं हैं। (यह तब हो सकता है जब सीपीयू किसी अन्य धागे को लिखने/पढ़ने के बीच में स्विच करता है) कई धागे के बीच साझा चरों तक पहुंचने पर आपको म्यूटेक्स (या कुछ अन्य सिंक्रनाइज़ेशन) का उपयोग करने की आवश्यकता है।

संपादित करें:

++ आप कोशिश करते हैं और ( WinForms में के रूप में फेंके जाने एक बिना किसी अपवाद के) ऐसा करने के लिए स्वतंत्र हैं, जैसे C अन्य भाषाओं में है, लेकिन आप कठिन सीखने पहुंच जाएंगे मार्ग!

आह हाँ ... मैं C/C++ और सी # और इसलिए बीच स्विच किया गया था एक छोटे से अधिक सामान्य तो मैं किया गया है चाहिए, खेद ... वह सही है, तो आप इस सी में कर सकते हैं/सी ++, लेकिन यह आपको काटने के लिए वापस आ जाएगा!

2

वापस बराबर डीबगिंग के दौरान फेंका गया था है, तो आप क्या मिला बजाय एक आंतरायिक रन-टाइम फांसी परिदृश्य था । अच्छा! :) इसलिए 2.0 के साथ उन्होंने इस परिदृश्य को एक अपवाद फेंक दिया और काफी हद तक ऐसा किया।

इसके लिए वास्तविक कारण शायद (एडम हैइल राज्यों के रूप में) कुछ प्रकार की सहमति/ताली समस्या है। ध्यान दें कि सामान्य .NET एपीआई (जैसे TextBox.Text = "हैलो";) आदेश भेजता है (जिसके लिए तत्काल कार्रवाई की आवश्यकता होती है) जो अपडेट को क्रियान्वित करने वाले से अलग थ्रेड पर किए गए मुद्दों को बना सकता है। Invoke/BeginInvoke का उपयोग करके POST का उपयोग करता है जो कार्रवाई को कतार देता है।

SEND और POST here पर अधिक जानकारी।

1

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

कुछ एपीआई सिस्टम के मौजूदा थ्रेड स्वामित्व को बदलने का एक तरीका प्रदान करते हैं ताकि आप अंतर-थ्रेड संचार का सहारा लेने के बिना अस्थायी रूप से (या स्थायी रूप से) अन्य धागे से सिस्टम अपडेट कर सकें।

0

मुझे लगता है कि यह एक शानदार सवाल है - और मुझे लगता है कि एक बेहतर उत्तर की आवश्यकता है।

निश्चित रूप से एकमात्र कारण यह है कि कहीं ढांचे में कुछ ऐसा है जो बहुत धागा-सुरक्षित नहीं है। क्या यह .NET या Win32 के साथ एक समस्या है - और मेरे लिए क्या करने के बजाय स्रोत को ठीक करने के लिए कोई धक्का नहीं है, मेरे लिए, एक बुरा काम की तरह लगता है?

कोई भी जानता है कि वास्तविक अंतर्निहित मुद्दा कहां है?

23

मुझे लगता है कि यह एक शानदार सवाल यह है कि - और मैं वहाँ एक बेहतर जवाब की जरूरत है लगता है।

निश्चित रूप से एकमात्र कारण यह है कि कहीं फ्रेमवर्क में कुछ है जो बहुत थ्रेड-सुरक्षित नहीं है।

कि "कुछ" सिस्टम में प्रत्येक नियंत्रण पर लगभग हर एक उदाहरण सदस्य है। Windows.Forms।

सिस्टम में कई नियंत्रणों के लिए एमएसडीएन दस्तावेज। Windows.Forms, अगर उनमें से सभी नहीं हैं, तो "इस प्रकार के किसी भी सार्वजनिक स्थिर (विजुअल बेसिक में साझा) सदस्य थ्रेड सुरक्षित हैं। किसी भी इंस्टेंस सदस्यों की गारंटी नहीं है धागा सुरक्षित हो। "

इसका मतलब यह है कि इस तरह के TextBox.Text {get; set;} के रूप में उदाहरण के सदस्यों रैत्रांत नहीं हैं।

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

[संपादित करें]

हालांकि इस सवाल ही पूछता है "क्यों" यहाँ एक लेख है कि बताते हैं करने के लिए "कैसे" का लिंक है:

कैसे करें: थ्रेड-सुरक्षित कॉल बनाओ विंडोज फॉर्म्स नियंत्रण को http://msdn.microsoft.com/en-us/library/ms171728.aspx

+1

पुनर्विक्रेता होना पूरी तरह से संभव है लेकिन थ्रेड-सुरक्षित नहीं है। विचार करें (एफ) => {x + = 1; f (x); एक्स - = 1; } जो अतिप्रवाह के लिए ठीक है अगर एफ (एक्स) एक धागे पर लैम्ब्डा को फिर से प्रस्तुत करता है लेकिन बहु-प्रसारित होने पर एक्स पर दौड़ता है। –

7

MSDN

पर

हालांकि यह लग रहा है उचित जॉन्स जवाब सही नहीं है। असल में जब भी Invoke का उपयोग करते हैं तब भी आप सुरक्षित नहीं हैं मृत-लॉक परिस्थितियों में नहीं चल रहे हैं। इनवॉक का उपयोग करके पृष्ठभूमि थ्रेड पर निकाली गई घटनाओं से निपटने पर भी इस समस्या का कारण बन सकता है।


असली कारण दौड़ की स्थिति के साथ क्या करना अधिक है और प्राचीन Win32 समय में वापस देता है। मैं यहां विवरणों की व्याख्या नहीं कर सकता, कीवर्ड संदेश पंप, WM_PAINT ईवेंट और "SEND" और "POST" के बीच सूक्ष्म अंतर हैं।


में अधिक जानकारी यहाँ here और here पाया जा सकता है।

0

हम्म मुझे पूरा यकीन नहीं है लेकिन मुझे लगता है कि जब हमारे पास प्रतीक्षा सलाखों जैसे प्रगति नियंत्रण होते हैं, प्रगति सलाखों को हम अपने मूल्यों को किसी अन्य धागे से अपडेट कर सकते हैं और सब कुछ बिना किसी ग्लिच के काम करता है।

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