2009-08-15 5 views
6

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

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

  • मुझे पता है कि धागे ThreadPool एमटीए हैं। लेकिन, इसे एसटीए पर क्यों सेट नहीं किया जा सकता है? बस इसके बारे में उत्सुक है।
  • एक और सवाल है कि बस मेरे सिर में पॉप: क्यों हम एक
    संदेश पंप जब Showdialog() (
    प्रदर्शन एक फार्म के लिए)

उत्तर

8

अपार्टमेंट को CoInitializeEx() को कॉल द्वारा चुना जाता है। थ्रेड पूल में एक थ्रेड पहले ही कॉल कर चुका है, उस कॉल के बाद अपार्टमेंट बदलना संभव नहीं है।

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

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

आपको एप्लिकेशन के साथ एक संदेश लूप पंप करने की आवश्यकता नहीं थी। Run() क्योंकि ShowDialog() अपना संदेश लूप शुरू करता है। इस तरह यह समानता प्राप्त करता है। जैसे ही संवाद बंद हो जाता है, वह नेस्टेड लूप निकलता है।

+0

उत्तर के लिए धन्यवाद। क्या आप एक लिंक पर इंगित कर सकते हैं, जो कहता है कि ShowDialog() अपना संदेश लूप शुरू करता है। –

+0

http://www.red-gate.com/products/reflector। सिफारिश की। –

+0

धन्यवाद। आवेदन। RunDialog (यह) चाल करता है। –

8

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

यदि आप थ्रेड सेटिंग्स पर ठीक दाग नियंत्रण रखना चाहते हैं, तो आपको एक समर्पित धागा बनाना चाहिए। अपार्टमेंट राज्य की स्थापना करना इसका एक आदर्श उदाहरण है।


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

यदि आप उस थ्रेड के लिए एक पूर्ण संदेश पंप लागू करते हैं, तो आप एक अलग थ्रेड पर एक फॉर्म बना सकते हैं, लेकिन आमतौर पर अपने काम की वस्तुओं को पृष्ठभूमि धागे पर रखना बेहतर होता है, और यूआई के बाद से अपने एन्क्रिप्शन प्रोग्रामिंग तकनीकों का उपयोग करना बेहतर होता है धागा उत्तरदायी।

+0

उत्तर के लिए धन्यवाद। "थ्रेडपूल में एक धागा किसी भी समय सीएलआर द्वारा आपके ज्ञान के बिना प्रतिस्थापित किया जा सकता है।" यह नहीं पता था। इसका क्या मतलब है? –

+1

थ्रेडपूल आपके प्रोग्राम के चलते धागे बनाता है और नष्ट करता है। थ्रेडपूल में केवल एक निश्चित संख्या में धागे की आवश्यकता नहीं है (जरूरी)। इस संबंध में .NET 4 का थ्रेडपूल और भी लचीला है। इसमें काम चोरी के लिए सभी प्रकार के नए उपकरण हैं, आदि, जो आपके ऐप के रनटाइम के दौरान धागे को फैलाने और नष्ट करने का कारण बनता है। –

+0

ओह..हाँ मैं संदेश पंप के बारे में पूरी तरह से अवगत हूं। इसलिए, थ्रेडपूल थ्रेड या एक नए धागे के माध्यम से एक फॉर्म बनाने के लिए उस धागे से जुड़े संदेश पंप की आवश्यकता होगी। लेकिन, मैं फॉर्म को प्रदर्शित करने के लिए ShowDialog() का उपयोग करता हूं और इसके लिए संदेश पंप की आवश्यकता नहीं होती है क्योंकि यह अवरुद्ध कॉल है। असल में, मैं सिर्फ उत्सुक था कि हम थ्रेडपूल थ्रेड की अपार्टमेंट स्थिति को एसटीए क्यों नहीं बदल सकते हैं। धन्यवाद। –

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