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