2016-08-12 15 views
5

मैं बहु सूत्रण अवधारणाओं सीख रहा हूँ (सामान्य रूप में और सी # नेट के लिए लक्षित)। विभिन्न लेख पढ़ना, अभी भी कुछ बुनियादी अवधारणाओं को पूरी तरह से समझ नहीं सका।सी # नेट: "बहु लड़ी पिरोया अपार्टमेंट" और "बहु सूत्रण"

मैं this प्रश्न पोस्ट करें। "हंस पासेंट" ने इसे अच्छी तरह समझाया लेकिन मैं इसके कुछ हिस्सों को समझने में सक्षम नहीं था। तो मैंने googling शुरू किया।

मैं this सवाल जो कोई जवाब पढ़ें।

मल्टीथ्रेडिंग और एमटीए समान है?

मैं एक WinForm आवेदन जो एसटीए (के रूप में अपनी विधि मुख्य() ऊपर उल्लेख किया है) है लिखने मान लीजिए, फिर भी मैं अपने आवेदन में एक से अधिक थ्रेड बना सकते हैं। मैं सुरक्षित रूप से कह सकता हूं कि मेरा आवेदन "बहु-थ्रेडेड" है। क्या इसका मतलब यह भी है कि मेरा आवेदन एमटीए है?

जबकि एसटीए/एमटीए के बारे में बात, लेख (जैसे this) के सबसे बारे में कॉम/DCOM/स्वचालन/ActiveX बात करते हैं। क्या इसका मतलब है कि डॉटनेट के पास एसटीए/एमटीए से कोई लेना देना नहीं है?

उत्तर

6

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

बेशक यह परिणाम है और वे काफी अप्रिय हो सकता है। यह घातक है यदि आपके प्रोग्राम का यूआई थ्रेड एमटीए में है क्योंकि यह मूल रूप से थ्रेड-असुरक्षित कई बाहरी घटकों का उपयोग करता है। क्लिपबोर्ड काम नहीं करेगा, ड्रैग + ड्रॉप काम नहीं करता है, ओपनफाइलडियलॉग आमतौर पर सिर्फ आपके प्रोग्राम को लटकता है, WebBrowser इसकी घटनाओं को नहीं रोकेगा।

कुछ घटक इस के लिए जाँच करें और एक अपवाद बढ़ा लेकिन यह जाँच लगातार लागू नहीं है। जबकि फ्लैट राज्य सामान्य रूप से मायने रखती केवल अप्रबंधित कोड के लिए, WPF अवधारणा उधार लिया और उठाती WPF, उल्लेखनीय है "क्योंकि कई UI घटक इस आवश्यकता बुला धागा, एसटीए होना चाहिए।" जो थोड़ा भ्रामक है, इसका वास्तव में क्या अर्थ है कि धागे के पास अपने नियंत्रण को काम करने की अनुमति देने के लिए एक प्रेषक होना चाहिए। लेकिन अन्यथा एसटीए वादे के अनुरूप।

यह जब घटक COM उपयोग करता है और लेखक एक प्रॉक्सी प्रदान की गई है काम कर सकते हैं। कॉम इंफ्रास्ट्रक्चर अब घटक थ्रेड-सुरक्षित बनाने के लिए कदम उठाता है, यह एक नया धागा बनाता है जो इसे एक सुरक्षित घर देने के लिए एसटीए है। और प्रत्येक विधि कॉल स्वचालित रूप से मार्शल हो जाती है, इसलिए यह उस धागे पर चलता है, इस प्रकार थ्रेड-सुरक्षा प्रदान करता है। Dispatcher.Invoke() के बराबर समकक्ष लेकिन पूरी तरह से स्वचालित किया। नतीजा यह है कि यह धीमा है, एक साधारण संपत्ति का उपयोग जो आम तौर पर कुछ नैनोसेकंड लेता है, अब कई माइक्रोसॉन्ड ले सकता है।

आप घटक एमटीए के साथ-साथ एसटीए समर्थन करता है तो भाग्यशाली होगा। यह आम नहीं है, माइक्रोसॉफ्ट की तरह कोई भी अपने पुस्तकालयों को थ्रेड-सुरक्षित रखने के लिए अतिरिक्त हजार मील की दूरी पर जाता है।

मैं शायद ज़ोर देना चाहिए कि अपार्टमेंट की अवधारणाओं पूरी तरह .NET फ्रेमवर्क में याद आ रही है। अपार्टमेंट प्रकार को बताए जाने की मूल बातें के अलावा, आवश्यक है क्योंकि .NET प्रोग्रामों को अक्सर अप्रबंधित कोड के साथ इंटरऑप करने की आवश्यकता होती है। तो कार्यकर्ता धागे के साथ एक winforms अनुप्रयोग लिख ठीक है, और उन कार्यकर्ता धागे एमटीए में हमेशा से रहे हैं, तो आप फिर भी धागे की सुरक्षा अपने आप से निपटने के लिए मिलता है और कुछ भी नहीं स्वचालित है।

यह आम तौर पर अच्छी तरह से समझा जाता है, बस हर कोई जानता है कि lock कीवर्ड, कार्य और पृष्ठभूमि कक्षाओं का उपयोग कैसे करें और यह पता है कि वर्क थ्रेड से UI को अद्यतन करने के लिए Control.Begin/Invoke() विधि आवश्यक है। जब आप इसे गलत समझते हैं तो आपको याद दिलाने के लिए एक अवैधऑपरेशन अपवाद के साथ। सिस्टम की बजाय थ्रेड-सुरक्षा की देखभाल करने वाले प्रोग्रामर को छोड़कर यह थ्रेड का उपयोग करना कठिन बनाता है। लेकिन आपको प्रणाली से बेहतर करने के लिए आपको कई अवसर मिलते हैं। जो आवश्यक था, इस प्रणाली द्वारा प्रदत्त थ्रेड-सुरक्षा को गंभीर काले आंख मिली जब जावा ने 90 के उत्तरार्ध के मध्यवर्ती युद्धों के दौरान चेहरे पर इसे दबा दिया।

1

कुछ सवाल कर रहे हैं, लेकिन पहले की इस से प्रारंभ करते हैं:

एक अपार्टमेंट एक संदर्भ में, जहां एक COM वस्तु प्रारंभ और क्रियान्वित किया जाता है, और यह एक या तो एकल थ्रेड (एसटीए) हो सकता है, सामान्य रूप से थ्रेड नहीं के लिए इस्तेमाल किया -साफ वस्तुओं, या बहु धागा।

अवधि अपार्टमेंट, जो निर्माणों जिसमें कॉम वस्तुओं

बनाई गई हैं से वर्णन करता है: https://msdn.microsoft.com/en-us/library/ms809971.aspx

तो Multithreading और एमटीए ही नहीं हैं, लेकिन एमटीए थ्रेड है। हम कह सकते हैं कि एसटीए और एमटीए COM वस्तुओं से संबंधित हैं। आप यहां और अधिक पढ़ सकते हैं: https://msdn.microsoft.com/en-us/library/ms693344(v=vs.85).aspx

तो, आपके दूसरे प्रश्न के लिए, यदि आपका WinForm एप्लिकेशन "बहु-थ्रेडेड" है तो इसका मतलब यह नहीं है कि यह "एमटीए" है।

अंत में, एमटीए/एसटीए अवधारणाएं नेट तकनीक से पुरानी हैं, लेकिन हम यह नहीं कह सकते कि उनके पास कुछ भी नहीं है, क्योंकि नेट एसटीए और एमटीए दोनों में COM प्रौद्योगिकी का समर्थन करता है।

मैं अपने जवाब की सहायता से आप अपार्टमेंट और थ्रेडिंग के बीच अंतर समझने के लिए उम्मीद है।

अधिक दिलचस्प यहाँ पढ़ने: Could you explain STA and MTA?

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