2009-08-18 12 views
14

मैं WPF के लिए नया हूं, और मैंने पढ़े गए प्रत्येक ट्यूटोरियल में, उनके पास [System.STAThread] विशेषता Main विधि पर लागू है, या वे पाठक को ऐसा करने के लिए कहते हैं।डब्ल्यूपीएफ को मुख्य विधि पर लागू होने के लिए STAThread विशेषता क्यों आवश्यक है?

क्या यह विशेषता वास्तव में "आवश्यक" है? और यदि हां, तो क्यों?

उत्तर

32

यह एक डब्ल्यूपीएफ की तुलना में एक विंडोज़ आवश्यकता है, और पहले .NET से विंडोज फॉर्म और नियंत्रण के मूल डिजाइन पर वापस चला जाता है।

STAThread "एकल-थ्रेड वाले अपार्टमेंट" को संदर्भित करता है जो वर्तमान (मुख्य) धागे द्वारा उपयोग किए जाने वाले थ्रेडिंग मॉडल को संदर्भित करता है। उपयोग में थ्रेडिंग मॉडल यह बताता है कि अन्य .NET और COM अनुप्रयोग आपके एप्लिकेशन (और मूल रूप से, इसके धागे) से कैसे बात करेंगे। सिंगल थ्रेडेड एप्लिकेशन मॉडल की आवश्यकता है कि एक ही ऑब्जेक्ट एक समय में एक से अधिक एसटीए थ्रेड में "लाइव" हो, एमटीए थ्रेड मॉडल छंद; और पॉइंटर्स को केवल मार्शेलिंग-ए-ऑब्जेक्ट के माध्यम से अपार्टमेंट में डेटा तक पहुंचने की अनुमति देता है।

असल में, [STAThread] घोषणा के साथ, अन्य अनुप्रयोगों को पता चलेगा कि डेटा भेजने पर आपकी थ्रेड की नीति क्या है। एसटीए मॉडल विंडोज थ्रेड्स/अनुप्रयोगों के लिए सबसे आम थ्रेडिंग मॉडल है; लेकिन आप कभी-कभी कुछ कोड में आते हैं जो एसटीए-मॉडलिंग थ्रेड से बुलाए जाने पर नहीं चलेगा, क्योंकि यह एसटीए प्रतिबंधों का पालन नहीं करने वाले तरीकों से थ्रेड सीमाओं में डेटा भेजने/प्राप्त करने के लिए डिज़ाइन किया गया है। पहले से जानना कि किसी दिए गए धागे का अपार्टमेंट मॉडल आईडीई को रनटाइम के दौरान थ्रेड सीमाओं में ऑब्जेक्ट का उपयोग करने का प्रयास करते समय गंदा पहुंच उल्लंघन त्रुटियों के बजाय संकलन-समय पर इन अपवादों को पकड़ने की अनुमति देता है।

आपको कम से एसटीए और MSDN लेख से एमटीए धागे के बारे में पढ़ सकते हैं: http://msdn.microsoft.com/en-us/library/ms680112(VS.85).aspx

ध्यान दें कि (WPF पहले से) भी सामान्य NET अनुप्रयोगों मुख्य के ऊपर की आवश्यकता [STAThread] घोषणा()।

4

इस blog entry में इसके लिए एक उत्कृष्ट उत्तर है। ब्लॉग से

का हवाला देते हुए:

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

विंडोज फॉर्म एक एमटीए या फ्री थ्रेडेड अपार्टमेंट के भीतर समर्थित नहीं है। विंडोज फॉर्म का उपयोग करने वाले अनुप्रयोगों को हमेशा अपार्टमेंट शैली का उपयोग करना चाहिए, क्योंकि कुछ अन्य घटक अपार्टमेंट की स्थिति को अनुचित रूप से प्रारंभ कर सकता है।

+0

यदि यह शुरुआती के लिए "अधिक जटिल" नहीं है .. तो आपको इसकी आवश्यकता नहीं है ..मुझे पढ़ना अच्छा लगता है :) –

+2

संदर्भ उद्देश्यों के लिए SO पर सारांश होना अभी भी अच्छा है, और यदि कहा गया ब्लॉग ऑफलाइन हो जाता है, तो पोस्ट हटा दिया जाता है, माइक्रोसॉफ्ट नरक की एक गेंद में जलता है, इत्यादि। –

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