तो यह [MTAThread] विशेषता के साथ चिह्नित कोड नहीं चला सकता है।
ऐसा नहीं है कि यह कैसे काम करता है। अपार्टमेंट का प्रकार एक धागे की संपत्ति है, एक विधि के नहीं। आप [STAThread] विशेषता को केवल .NET प्रोग्राम की मुख्य() विधि पर लागू करते हैं। यह प्रोग्राम चलाने के लिए बनाए गए पहले थ्रेड के अपार्टमेंट प्रकार को निर्धारित करता है। आवश्यक है क्योंकि आप थ्रेड चलने के बाद SetApartmentState() को कॉल नहीं कर सकते हैं। इसके अलावा, विशेषता का कोई मतलब नहीं है, धागा अपने जीवनकाल के लिए एसटीए में रहता है। आप कभी भी [MTAThread] नहीं देखते क्योंकि यह डिफ़ॉल्ट है।
एसटीए के एक थ्रेड में कुछ सीमाएं हैं। यह कभी भी अवरुद्ध नहीं हो सकता है क्योंकि इससे किसी भी कोड को अवरुद्ध कर दिया जाएगा और अक्सर किसी अपार्टमेंट को थ्रेडेड COM ऑब्जेक्ट की विधि कॉल करने का प्रयास किया जाएगा। और इसे एक संदेश लूप पंप करना चाहिए ताकि COM किसी अन्य थ्रेड से विधि कॉल को मार्शल कर सके। मार्शल विधि कॉल केवल तब निष्पादित की जा सकती है जब कोई थ्रेड 'निष्क्रिय' होता है, किसी भी कोड को निष्पादित करने में व्यस्त नहीं होता है। एक संदेश पाश प्रदान करता है कि 'व्यस्त नहीं' राज्य।
COM घटक पर भी आवश्यकताएं हैं। इसे ऑटोमेशन द्वारा समर्थित प्रकारों के सबसेट में प्रतिबंधित करके, या तो मानक मार्शलर का उपयोग किया जा सकता है, इसे मार्शलिंग का समर्थन करना चाहिए। या कस्टम मार्शलिंग के लिए प्रॉक्सी/स्टब जोड़ी प्रदान करके। रजिस्ट्री कुंजी निर्धारित करता है कि मार्शलिंग कैसे किया जाता है।
एसटीए और एमटीए थ्रेड के बीच एक अपार्टमेंट थ्रेडेड ऑब्जेक्ट साझा करना स्पष्ट रूप से समर्थित है। एसटीए थ्रेड इसे बनाना चाहिए, एमटीए थ्रेड (या अन्य एसटीए धागे) पर किसी भी कॉल को मार्शल किया गया है। जो सुनिश्चित करता है कि घटक केवल उसी धागे पर किए गए कॉल देखता है, इस प्रकार थ्रेड-सुरक्षा सुनिश्चित करता है। कोई अतिरिक्त लॉकिंग की आवश्यकता नहीं है।
अंतिम लेकिन कम से कम नहीं, अगर आप एक एमटीए थ्रेड पर एक अपार्टमेंट थ्रेडेड COM ऑब्जेक्ट बनाते हैं तो COM स्वचालित रूप से इसे एक सुरक्षित घर देने के लिए एक एसटीए थ्रेड बना देगा। इसके लिए एकमात्र विफलता मोड तब होता है जब COM घटक मार्शलिंग का समर्थन नहीं करता है। इस तरह से ऐसा करने का एक नुकसान यह है कि प्रत्येक कॉल का मार्शल किया जाएगा। यह धीमा है।
स्रोत
2010-12-25 16:24:12
एमटीएथ्रेड केवल सी # में डिफ़ॉल्ट है। Vb.net में STAThread डिफ़ॉल्ट है। बस कह रहा है ... क्योंकि मुझे – DanielG
पता लगाने में काफी समय लगा, यह एक वीबी.नेट कंसोल मोड प्रोजेक्ट के लिए सटीक है। एसटीए आवश्यकताओं बीटीडब्ल्यू का सकल उल्लंघन, एक एसटीए थ्रेड पंप करना चाहिए।वीबी प्रोग्रामर के पास कभी भी भाग्य कोड लिखने में बहुत भाग्य नहीं होता है, फॉर्म क्लास का डिफ़ॉल्ट उदाहरण एक और बड़ा जाल है। शायद यह सब उद्देश्य पर था :) –