2010-12-13 10 views
5

अगर मैं नेट में एक जाँच धागा है, और मुझे लगता है कि सूत्र में एक जाँच COM वस्तु, और फिर धागा खत्म बना सकते हैं - उस वस्तु की कि उदाहरण मारने करता है?COM इंटरॉप नेट एसटीए

मेरी समझ सही है कि जाँच COM ऑब्जेक्ट से अधिक थ्रेड और क्रम के लिए सभी फ्लैट धागा में होती हैं स्वचालित रूप से कॉल मार्शल होगा द्वारा पहुँचा जा सकता? क्या वह धागा धागा है जिसने उदाहरण बनाया है? तो अगर वह धागा खत्म हो जाता है, तो उदाहरण अनाथ और खो गया है? या एसटीए के उदाहरणों के लिए बनाया गया एक अलग धागा है?
ASPCompat = True के साथ ASP.Net में यह कैसे खेलता है? मेरी समझ यह है कि प्रत्येक अनुरोध को यादृच्छिक कार्यकर्ता थ्रेड द्वारा संभाला जाता है, और यदि मेरा एसटीए घटक सत्र में रखा जाता है, तो क्या यह यादृच्छिक रूप से मर जाएगा क्योंकि अनुरोध प्रोसेसर थ्रेड जो इसे बनाया हो सकता है?

उत्तर

5

आप एक .NET एसटीए थ्रेड पर अपने एसटीए COM वस्तु बनाते हैं तो आपके वस्तु के लिए सभी कॉल कि धागा करने के लिए मार्शल कर रहे हैं।

आप एक .NET एमटीए थ्रेड पर अपने एसटीए COM वस्तु बनाते हैं, तो क्रम एक एसटीए धागा और मार्शल कि धागा करने के लिए सभी कॉल्स का निर्माण करेगा।

तो, जब आपका (एसटीए) धागा मौजूद है, तो आपकी COM ऑब्जेक्ट्स पहुंच योग्य नहीं हैं।

एक समाधान एक नए धागे पर वस्तुओं को बनाने के लिए हो सकता है जिसके लिए आप जीवनकाल को नियंत्रित कर सकते हैं।

मुझे लगता है कि जैसे एक समान बात किया है:

using (ManualResetEventSlim mre = new ManualResetEventSlim(false)) 
{ 
    Thread _STAThread = new Thread(new ThreadStart(() => 
       { 
        globalComObject = new ComClass(); 
        mre.Set(); 
        try 
        { 
         Thread.CurrentThread.Join(); 
        } 
        catch (ThreadAbortException) 
        { 
        } 
       })); 
       _STAThread.SetApartmentState(ApartmentState.STA); 
       _STAThread.IsBackground = true; 
       _STAThread.Start(); 
       mre.Wait(); 
} 

कोड एक नया धागा शुरू होता है, कि धागे पर एक COM वस्तु के निर्माण के लिए जाँच और इंतजार करने के लिए अपार्टमेंट की स्थापना की। धागा स्वयं तब तक चल रहा है जब तक आपका एप्लिकेशन बाहर निकलता है (IsBackground = true) या आप धागे को Thread.Abort() के साथ स्पष्ट रूप से मार देते हैं।

लेकिन ध्यान रखें, जो आपके COM ऑब्जेक्ट के लिए सभी कॉल मार्शल कर रहे हैं और इस तरह है कि एक धागे पर एक के बाद धारावाहिक एक मार डाला। यह आपके ऐप में एक बड़ी बाधा हो सकती है।

ASPCompat = सच संकेत ASP.NET क्रम है, कि तुम एसटीए COM ऑब्जेक्ट का उपयोग कर रहे हैं और इस प्रकार एक जाँच धागा भीतर पेज चल रहा है। अन्यथा आप एक अपवाद मिल migth या अपने सभी COM ऑब्जेक्ट स्वचालित रूप से उत्पन्न एसटीए धागा अपने पृष्ठ के लिए सभी अनुरोध द्वारा साझा में चलेगा (MSDN यहाँ देखें: http://msdn.microsoft.com/en-us/library/zwk9h2kb(VS.80).aspx)

+0

तो यह मतलब है कि अगर मैं ASPCompat का उपयोग करें और डाल कॉम सत्र में वस्तुओं वे यादृच्छिक रूप से मर जाएगा क्योंकि उन्हें बनाया धागा समाप्त हो जाएगा ?? –

+1

मुझे नहीं लगता, क्योंकि ASP.NET अनुरोधों को संभालने के लिए थ्रेडपूल का उपयोग करता है। अनुरोध को संसाधित करने के बाद थ्रेड "मर" नहीं जाएंगे। इन ज्ञानबेस लेखों को देखें जहां माइक्रोसॉफ्ट का कहना है कि सत्र स्थिति में एसटीए COM वस्तुओं को स्टोर करना संभव है लेकिन इसके खिलाफ अनुशंसा करता है: http://support.microsoft.com/kb/243543/en-us, http://support.microsoft .com/केबी/243,815/hi हमें- – Jan

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