2011-10-22 14 views
6

मैं बस, इस लेख, "Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework" पढ़ रहा था जेफरी रिक्टर द्वारा, और मैं ReRegisterForFinalize या SuppressFinalize उपयोग करने के लिए किसी भी वास्तविक जीवन नमूना के बारे में सोच नहीं सकता था।ReRegisterForFinalize SuppressFinalize वास्तविक जीवन उदाहरण

क्या कोई मुझे कुछ उदाहरण प्रदान कर सकता है?

+0

'SuppressFinalize' आम है, लेकिन कोई विचार नहीं है कि मैं' ReRegisterForFinalize' का उपयोग करना चाहता हूं। – CodesInChaos

उत्तर

9

.NET ढांचे में उपयोग की जाने वाली कुछ जगहें हमेशा देखने के लिए एक अच्छी जगह होती हैं। मूल पैटर्न हैं:

  • एक डिस्पोजेड ऑब्जेक्ट का पुन: उपयोग किया जाता है। निपटान() विधि को SuppressFinalize कहा जाता है, इसलिए इसे फिर से पंजीकृत करने की आवश्यकता है (नेटिव विन्डो, RequestContextBase, TaskExceptionHolder क्लास)
  • फ़ाइनलाइज़र विफल रहा और अपवाद पकड़ा। करने के लिए थोड़ा लेकिन बाद में पुनः प्रयास करने के लिए। यही कारण है कि कोड के साथ करता है, तो लपेटा जाता है (! & & Environment.HasShutdownStarted! AppDomain.CurrentDomain.IsFinalizingForUnload()) यह सुनिश्चित करें कि यह कर भावना (DynamicResolver और LoaderAllocatorScout वर्ग)
  • वस्तु एक कैशिंग योजना में भाग लेता है बनाता है और फिर से हो जाता है बनाने के लिए कैश्ड (ओवरलैप्डडाटा क्लास)
3

IDisposable के कार्यान्वयन के लिए अक्सर SuppressFinalize की आवश्यकता होती है: कोड के लिए here या here देखें।

मेरे पास अब ReRegisterForFinalize पर एक अच्छा उदाहरण नहीं है।

+1

ठीक है 'SuppressFinalize' उन नमूनों को पढ़ने के बाद, बहुत कठोर-आगे दिखता है। अगर मैं ऑब्जेक्ट को अपने आप से हटा देता हूं तो महंगी अंतिम विधि को बुलाया जा सकता है। – Nahum

1

उदाहरण के पुनरुत्थान के दौरान आपको ReRegisterForFinalize की आवश्यकता है। पुनरुत्थान (लिंक किए गए आलेख में उल्लिखित) एक वस्तु को अपने विनाशक (अंतिमकर्ता) से पुनः बूट करने की क्रिया है।

यह केवल प्रश्न को "ऑब्जेक्ट को पुनर्जीवित करेगा" पर ले जाता है। this question के उत्तर में मैंने अनुमान लगाया कि एक कनेक्शनपूल या इसी तरह के निर्माण का उपयोग कर सकते हैं।

+0

मुझे अभी भी कोई जानकारी नहीं है कि मैं 'सामान्य' एप्लिकेशन या लाइब्रेरी कोड में 'ReRegisterForFinalize' – Nahum

+1

का उपयोग कब करना चाहूंगा। एक कनेक्शनपूल सॉफ्टवेयर का एक बेहद विशिष्ट टुकड़ा है। –

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