2009-08-10 10 views
13

मुझे कुछ बुरी तरह लिखित तृतीय पक्ष COM घटकों को कॉल करना है जिनमें मेमोरी लीक है और एक लंबी चल रही प्रक्रिया के भीतर एकल थ्रेडेड अपार्टमेंट [एसटीए] का उपयोग करता है।क्या AppDomain .NET कोड के लिए एक प्रक्रिया के बराबर है?

मुझे पता है कि अलग प्रक्रिया इसे लागू करने का एक अच्छा तरीका होगा और मैं इसे कभी-कभी लंबी चल रही प्रक्रिया से पुनरारंभ कर सकता हूं।

क्या ऐपडोमेन का उपयोग किया जा सकता है? क्या AppDomain एक एसटीए धागा धागा है अगर apopiately चिह्नित? क्या COM वस्तुओं के लिए इसकी अपनी याददाश्त है? ऐपडोमेन को अनलोड करना प्रक्रिया को मारने के बराबर है?

उत्तर

22

एक AppDomain ही प्रदान नहीं करता है एक प्रक्रिया के रूप में अलगाव की डिग्री करता है। वास्तव में यदि आप चिंतित हैं कि तीसरे पक्ष के घटक अच्छे आकार में नहीं हैं तो जोखिम है, यह आपके .NET एप्लिकेशन को नीचे ले जाएगा।

अनलोड किए जाने पर अप्रबंधित कोड निष्पादित होने पर एक ऐपडोमेन को अनलोड नहीं किया जा सकता है, इसलिए आपको ऐपडोमेन में अपने तृतीय पक्ष कोड को नियंत्रित करने में कठिनाई हो सकती है। http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx

यहां तक ​​कि केवल प्रबंधित कोड के लिए, एक ऐपडोमेन एक मजबूत सैंडबॉक्स समाधान प्रदान नहीं करता है। जैसे यदि लोड किया गया कोड किसी भी धागे को जन्म देता है तो यह अनचाहे अपवादों के मामले में पूरी प्रक्रिया को नीचे ले जाएगा। इस प्रश्न में थोड़ा और जानकारी है: .NET - What's the best way to implement a "catch all exceptions handler"

जहां तक ​​मुझे पता है कि .NET अनुप्रयोग में कोड होस्ट करने का सबसे अच्छा विकल्प आईआईएस और एसक्यूएल सर्वर की तरह अपनी सीएलआर होस्ट प्रक्रिया को कार्यान्वित करना है।

+0

+1। मेरी स्वीकृति से काफी बेहतर है। :) –

0

एक AppDomain (एप्लिकेशन डोमेन), एक अलग वातावरण है जहां अनुप्रयोग निष्पादित होते हैं।

वे प्रबंधित कोड को क्रियान्वित करने के लिए अलगाव, उतराई, और सुरक्षा सीमाओं प्रदान करने में मदद।

  • प्रक्रिया को कम करने वाले कार्यों को अलग करने के लिए एप्लिकेशन डोमेन का उपयोग करें। यदि ऐपडोमेन की स्थिति कार्य निष्पादित करने योग्य स्थिति अस्थिर हो जाती है, तो ऐपडोमेन को प्रक्रिया को प्रभावित करने के बिना अनलोड किया जा सकता है। यह महत्वपूर्ण है जब प्रक्रिया को लंबे समय तक पुनरारंभ किए बिना लंबी अवधि के लिए चलाना आवश्यक है। आप पर उन डोमेन को एप्लिकेशन डोमेन का भी उपयोग कर सकते हैं जो डेटा साझा नहीं करना चाहिए।

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

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

अतः प्रश्न है कि ब्याज की हो सकती है:

मैं AppDomains के क्षेत्र में एक विशेषज्ञ होने का दावा नहीं होगा, लेकिन मुझे पूरा यकीन है कि एक COM ऑब्जेक्ट लीकिंग मेमोरी (यानी अप्रबंधित स्मृति) आपके द्वारा मुक्त नहीं होगी AppDomain nloading।शायद इस से अधिक परिचित कोई टिप्पणी कर सकता है।

ब्रायन के रूप में बताया, "... .नेट फ्रेमवर्क संस्करण में 2.0 डोमेन अनलोड करने के लिए गारंटी है नहीं, क्योंकि यह संभव धागे को क्रियान्वित करने को समाप्त करने का नहीं हो सकता है।"

+2

तो रोहित के लिए आप किस तरह की कार्रवाई की सिफारिश कर रहे हैं? –

+0

@ spoon16: आपका अपना उत्तर जोड़ने के लिए आपका स्वागत है। ;) –

+0

मुझे यह देखने के लिए उत्सुकता है कि जवाब क्या है। मेरे पास अभी पेशकश करने के लिए कोई नहीं है। –

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