2010-12-25 12 views
17

अगर हम इस तरह थ्रेड एसटीए बनाते हैं: Thread.SetApartmentState(STA); तो यह [MTAThread] विशेषता के साथ चिह्नित कोड नहीं चला सकता है।एमटीए धागे की तुलना में एसटीए धागे की सीमाएं क्या हैं?

हमने विंडोज़ और कंसोल अनुप्रयोगों में [STAThread] देखा है लेकिन मैंने कभी भी [MTAThread] विशेषता के साथ कोड नहीं देखा है और यह नहीं पता कि कौन सी .NET पुस्तकालय इस विशेषता का उपयोग करते हैं।

मेरा प्रश्न यह है कि एमटीए अपार्टमेंट राज्य (प्राकृतिक .NET धागे) के साथ धागे की तुलना में, एसटीए में सेट अपार्टमेंट राज्य के साथ धागे की सीमाएं क्या हैं?

उत्तर

18

तो यह [MTAThread] विशेषता के साथ चिह्नित कोड नहीं चला सकता है।

ऐसा नहीं है कि यह कैसे काम करता है। अपार्टमेंट का प्रकार एक धागे की संपत्ति है, एक विधि के नहीं। आप [STAThread] विशेषता को केवल .NET प्रोग्राम की मुख्य() विधि पर लागू करते हैं। यह प्रोग्राम चलाने के लिए बनाए गए पहले थ्रेड के अपार्टमेंट प्रकार को निर्धारित करता है। आवश्यक है क्योंकि आप थ्रेड चलने के बाद SetApartmentState() को कॉल नहीं कर सकते हैं। इसके अलावा, विशेषता का कोई मतलब नहीं है, धागा अपने जीवनकाल के लिए एसटीए में रहता है। आप कभी भी [MTAThread] नहीं देखते क्योंकि यह डिफ़ॉल्ट है।

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

COM घटक पर भी आवश्यकताएं हैं। इसे ऑटोमेशन द्वारा समर्थित प्रकारों के सबसेट में प्रतिबंधित करके, या तो मानक मार्शलर का उपयोग किया जा सकता है, इसे मार्शलिंग का समर्थन करना चाहिए। या कस्टम मार्शलिंग के लिए प्रॉक्सी/स्टब जोड़ी प्रदान करके। रजिस्ट्री कुंजी निर्धारित करता है कि मार्शलिंग कैसे किया जाता है।

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

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

+2

एमटीएथ्रेड केवल सी # में डिफ़ॉल्ट है। Vb.net में STAThread डिफ़ॉल्ट है। बस कह रहा है ... क्योंकि मुझे – DanielG

+0

पता लगाने में काफी समय लगा, यह एक वीबी.नेट कंसोल मोड प्रोजेक्ट के लिए सटीक है। एसटीए आवश्यकताओं बीटीडब्ल्यू का सकल उल्लंघन, एक एसटीए थ्रेड पंप करना चाहिए।वीबी प्रोग्रामर के पास कभी भी भाग्य कोड लिखने में बहुत भाग्य नहीं होता है, फॉर्म क्लास का डिफ़ॉल्ट उदाहरण एक और बड़ा जाल है। शायद यह सब उद्देश्य पर था :) –

0

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

+0

मैं कुछ 'COM' घटकों का उपयोग करता हूं और' एसटीए 'की आवश्यकता होती है। अपार्टमेंट राज्य बदलना मुझे क्या चाहिए। मैं परिणामों के बारे में निश्चित नहीं हूँ। एक 'एसटीए' धागा और एक 'एमटीए' धागा एक वस्तु को 'एएसपी.नेट' आवेदन के अंदर साझा करता है। – Xaqron

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