STAThread और मल्टीथ्रेडिंग


102

STAThread पर MSDN लेख से:

इंगित करता है कि COM थ्रेडिंग मॉडल एक आवेदन के लिए सिंगल-थ्रेडेड अपार्टमेंट (STA) है।

(संदर्भ के लिए, यह पूरा लेख है ।)

सिंगल-थ्रेडेड अपार्टमेंट ... ठीक है, जो मेरे सिर पर चला गया। इसके अलावा, मैंने कहीं पढ़ा है कि जब तक आपका एप्लिकेशन COM इंटरॉप का उपयोग नहीं करता है, तब तक यह विशेषता वास्तव में कुछ भी नहीं करती है। तो वास्तव में यह क्या करता है, और यह बहुपरत अनुप्रयोगों को कैसे प्रभावित करता है? मल्टीथ्रेडेड एप्लिकेशन (जिसमें Timerएस-एसिंक्रोनस मेथड कॉल का उपयोग करने वाले किसी भी व्यक्ति से कुछ भी शामिल है , न कि केवल थ्रेडपूल और इस तरह से) एमटीएथ्रेड का उपयोग करें, भले ही यह 'सुरक्षित होने के लिए' हो? वास्तव में STAThread और MTAThread क्या करता है?

जवाबों:


60

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

यदि आपको अपार्टमेंट के बारे में पता होना चाहिए, तो विवरण थोड़ा जटिल हो सकता है ; एक संभवतया-ओवरसिम्प्लीफाइड संस्करण यह है कि STA के रूप में टैग की गई COM ऑब्जेक्ट को STAThread पर चलाया जाना चाहिए, और MTA द्वारा चिह्नित COM ऑब्जेक्ट को MTA थ्रेड पर चलाया जाना चाहिए। इन नियमों का उपयोग करते हुए, COM इन विभिन्न वस्तुओं के बीच कॉल को अनुकूलित कर सकता है, जहाँ यह आवश्यक नहीं है, मार्शलों से बचना।


7
इसकी देखरेख की जाती है। बहुरंगी वस्तुएँ किसी भी धागे में चल सकती हैं। अपार्टमेंट थ्रेडेड ऑब्जेक्ट केवल उस अपार्टमेंट में चला सकते हैं जो वे बनाए गए थे।
1800 सूचना

28
STA थ्रेड पर STA ऑब्जेक्ट से MTA ऑब्जेक्ट पर कॉल, MTA थ्रेड पर Marshal होगा (जब तक MTA ऑब्जेक्ट फ़्री-थ्रेडेड मार्शलर लागू नहीं होता)। जैसा मैंने कहा, विवरण जटिल हो सकता है। (मैं कई वर्षों से के लिए COM टीम पर काम किया मुस्कुराहट )
ब्रूस

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

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

4
उन लोगों के लिए एक अधिक विस्तृत जवाब जो रुचि रखते हैं: stackoverflow.com/questions/4154429/apartmentstate-for-dummies
jgauffin

3

यह क्या करता है यह सुनिश्चित करता है कि CoInitializeपैरामीटर के रूप में निर्दिष्ट COINIT_APARTMENTTHREADED कहा जाता है। यदि आप किसी COM घटक या ActiveX नियंत्रण का उपयोग नहीं करते हैं तो इसका आप पर कोई प्रभाव नहीं पड़ेगा। यदि आप ऐसा करते हैं तो यह महत्वपूर्ण है।

नियंत्रण जो अपार्टमेंट थ्रेडेड होते हैं, प्रभावी रूप से सिंगल थ्रेडेड होते हैं, उनके लिए किए गए कॉल केवल उस अपार्टमेंट में संसाधित किए जा सकते हैं जो वे बनाए गए थे।

MSDN से कुछ और विवरण:

सिंगल-थ्रेडेड अपार्टमेंट (एसटीए) में बनाई गई वस्तुएं केवल उनके अपार्टमेंट के धागे से विधि कॉल प्राप्त करती हैं, इसलिए कॉल को क्रमबद्ध किया जाता है और केवल संदेश-कतार सीमाओं पर पहुंचता है (जब Win32 फ़ंक्शन PeekMessage या SendMessage कहा जाता है)।

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

जब किसी ऑब्जेक्ट को तटस्थ थ्रेडेड अपार्टमेंट (NTA) में चलाने के लिए कॉन्फ़िगर किया जाता है, तो उस थ्रेड को या तो STA या MTA में कहा जाता है, जो थ्रेड NTA में स्थानांतरित हो जाता है। यदि यह थ्रेड बाद में CoInitializeEx को कॉल करता है, तो कॉल विफल हो जाता है और RPC_E_CHANGED_MODE देता है।


MSDN आलेख COM परिप्रेक्ष्य से उपयोगी है, लेकिन क्या आप मुझे बता सकते हैं कि .NET विशेषता / के CoInitialize()जवाब में कब कॉल करता है ? नोट: MSDN पर लेख यहाँ है: CoInitializeEx फ़ंक्शनSTAThreadApartmentState
jrh

क्या थ्रेड-> सेटपार्टमेंटCoInitialize() आंतरिक रूप से उपयोग करता है? मैं वहाँ नीचे सभी रास्ते का पता लगाया विशेषता है, लेकिन निशान ठंडा हो गया है (मैं के लिए स्रोत नहीं मिल सकता है Thread::SetApartment)। क्या थ्रेड क्लास थ्रेड से है। (COM थ्रेड। ई) कहीं भी प्रलेखित है? क्या यह MFC, ATL, या कुछ और है?
jrh

@jrh मुझे उस सॉरी के अलावा और कोई विवरण नहीं पता है
1800 जानकारी

-15

STAThread C # GUI प्रोजेक्ट के मुख्य कार्य से पहले लिखा गया है। यह कुछ भी नहीं करता है लेकिन कार्यक्रम को एक ही धागा बनाने की अनुमति देता है।

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