[STAThread] क्या करता है?


293

मैं C # 3.5 सीख रहा हूं और मैं जानना चाहता हूं कि [STAThread]हमारे कार्यक्रमों में क्या होता है?

जवाबों:


240

STAThreadAttributeअनिवार्य रूप से COM घटकों के साथ संवाद करने के लिए Windows संदेश पंप के लिए एक आवश्यकता है। हालांकि कोर विंडोज फॉर्म COM का उपयोग नहीं करते हैं, ओएस के कई घटक जैसे सिस्टम डायलॉग इस तकनीक का उपयोग करते हैं।

MSDN थोड़ा और विस्तार से कारण बताता है:

STAThreadAttribute इंगित करता है कि अनुप्रयोग के लिए COM थ्रेडिंग मॉडल सिंगल-थ्रेडेड अपार्टमेंट है। यह विशेषता विंडोज फॉर्म का उपयोग करने वाले किसी भी एप्लिकेशन के प्रवेश बिंदु पर मौजूद होनी चाहिए; यदि इसे छोड़ दिया जाता है, तो Windows घटक सही तरीके से काम नहीं कर सकते हैं। यदि विशेषता मौजूद नहीं है, तो एप्लिकेशन मल्टीथ्रेडेड अपार्टमेंट मॉडल का उपयोग करता है, जो विंडोज फॉर्म के लिए समर्थित नहीं है।

यह ब्लॉग पोस्ट ( STAThread क्यों आवश्यक है? ) भी आवश्यकता को अच्छी तरह से समझाता है। यदि आप अधिक गहराई से देखना चाहते हैं कि थ्रेडिंग मॉडल सीएलआर स्तर पर कैसे काम करता है, तो जून 2004 से इस MSDN पत्रिका लेख को देखें (संग्रहीत, अप्रैल 2009)।


1
किसी भी विचार क्यों CompactFramework समर्थन नहीं करता है [STAThread]?
bvdb

1
stackoverflow.com/questions/4154429/apartmentstate-for-dummies यह जवाब मेरे जैसे नश्वर लोगों के लिए काफी समझ में आता है। यहाँ सिर्फ संदर्भ के लिए जोड़ा गया
Barış Akkurt

41

यह संकलक को बताता है कि आप सिंगल थ्रेड अपार्टमेंट मॉडल में हैं। यह एक बुराई COM बात है, यह आमतौर पर विंडोज फॉर्म (GUI) के लिए उपयोग किया जाता है क्योंकि यह अपने ड्राइंग के लिए Win32 का उपयोग करता है, जिसे STA के रूप में लागू किया जाता है। यदि आप कई धागों से एसटीए मॉडल का उपयोग कर रहे हैं तो आपको दूषित वस्तुएं मिलती हैं।

यही कारण है कि आपको गुई पर दूसरे धागे से आह्वान करना होगा (यदि आपने किसी भी प्रकार का कोडिंग किया है)।

मूल रूप से इसके बारे में चिंता न करें, बस स्वीकार करें कि Windows GUI थ्रेड्स को STA के रूप में चिह्नित किया जाना चाहिए अन्यथा अजीब सामान होता है।


2
जीयूआई का उपयोग करते समय मुख्य धागा को आह्वान करने की आवश्यकता से STAThread का कोई लेना-देना नहीं है। यह बस विंडोज संदेश पंप की प्रकृति के कारण है, और आमतौर पर मल्टीथ्रेडेड अनुप्रयोगों में इसे टाला नहीं जा सकता है।
Noldorin

3
वास्तव में, यह केवल COM घटकों जैसे ओएस संवाद और तीसरे पक्ष के घटकों से निपटने के बारे में है।
Noldorin

3
Win32 अपार्टमेंट के प्रसार की कोई अवधारणा नहीं करता है, इसके COM जो अवधारणा का परिचय देता है। COM "पुन: कार्य" क्या एक पूरी तरह से धागा अज्ञेयवादी प्रणाली (विंडोज़ संदेश पंप) है जो COM अपार्टमेंट्स में सिंक्रनाइज़ / क्रमबद्ध कोड निष्पादन के साधन के रूप में था।
एंथनीवजोन 8

1
बस स्वीकार करें कि विंडोज़ गुई थ्रेड्स को एसटीए के रूप में चिह्नित किया जाना चाहिए अन्यथा अजीब सामान होता है। :))))))
निपुण

1
@ नोल्डोरिन "मुख्य धागे को लागू करने की आवश्यकता" - यह तकनीकी रूप से एक आवश्यकता नहीं है । क्रॉस-थ्रेड अपवाद डीबगर के बाहर नहीं होते हैं। Ref: stackoverflow.com/questions/3972727/… । यह कहते हुए कि आपको इस समस्या का समाधान नहीं करना चाहिए!
शिव

31

यदि आवश्यक हो तो STAThreadAttribute सिंगल-थ्रेडेड COM अपार्टमेंट का उपयोग करने के लिए एक थ्रेड को चिह्नित करता है। डिफ़ॉल्ट रूप से, .NET COM को आरंभ में प्रारंभ नहीं करेगा। यह केवल तभी है जब COM की आवश्यकता होती है, जैसे कि जब COM ऑब्जेक्ट या COM कंट्रोल बनाया जाता है या जब ड्रैग 'एन' ड्रॉप की आवश्यकता होती है, तो COM को प्रारंभ किया जाता है। जब ऐसा होता है, तो .NET अंतर्निहित CoInitializeEx फ़ंक्शन को कॉल करता है, जो यह दर्शाता है कि एक थ्रेड को बहु-थ्रेडेड या सिंगल-थ्रेडेड अपार्टमेंट में शामिल होना है या नहीं।

अधिक जानकारी यहाँ पढ़ें (संग्रहीत, जून 2009)

तथा

STAThread की आवश्यकता क्यों है?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.