2010-08-11 19 views
16

क्या अंतिम बिंदु कुछ बिंदुओं पर अतिरिक्त .NET में निष्पादित होने की गारंटी है (अतिरिक्त बिजली आबादी और इसी तरह)? मुझे पता है कि जीसी कैसे काम करता है और यह वास्तव में जब वे दौड़ेंगे तो यह nondeterministic है।क्या .NET फ़ाइनलाइज़र हमेशा निष्पादित होते हैं?

(खोज ने अच्छे उत्तरों को प्रदर्शित नहीं किया है, इसलिए मैं इस सवाल को विलय की उच्च उम्मीद में नहीं जोड़ रहा हूं, जो कि आसानी से खोजने के लिए वास्तविक उत्तर नहीं है। इसके अलावा, मुझे पहले से ही जवाब पता है और अगर किसी ने इसका उल्लेख नहीं किया है तो कुछ दिनों के बाद इसे जोड़ने जा रहा हूं।)

उत्तर

24

finalizers वास्तव में कभी नहीं मार डाला, Raymond Chen explains के रूप में हो सकता है। तरह हास्यास्पद है कि इस सवाल का अपने वार्षिक CLR सप्ताह के दौरान कहा जाता है, बस दो दिन के बाद वह इसे :)

आलसी लोगों के लिए बताया गया है, (या बल्कि, एक) निष्कर्ष है:

एक सही ढंग से लिखित कार्यक्रम यह नहीं मान सकता कि फाइनलर कभी भी दौड़ेंगे।

यदि आप सोच रहे हैं कि आप अंतिम रूपकों पर भरोसा कर सकते हैं, तो यह पहले से ही आपको पता होना चाहिए: अंतिमकरण पर भरोसा न करें।

रेमंड चेन भी जुड़ा हुआ लेख में कहा गया है के रूप में:

finalizers एक सुरक्षा तंत्र, नहीं संसाधन सुधार के लिए एक प्राथमिक साधन हैं।

यदि आप संसाधनों को कैसे रिलीज़ करना चाहते हैं, तो डिस्पोजेबल पैटर्न पर एक नज़र डालें।


एक finalizer नहीं चला सकते हैं, उदाहरण के लिए, यदि:

  • एक और finalizer एक अपवाद फेंकता है।
  • एक और फाइनलाइज़र 2 सेकंड से अधिक समय लेता है।
  • सभी फाइनलरों को एक साथ 40 सेकंड से अधिक समय लगता है।
  • एक AppDomain दुर्घटनाओं या उतार दिया जाता है (हालांकि आप एक महत्वपूर्ण finalizer (CriticalFinalizerObject, SafeHandle या कुछ है कि तरह) के साथ इस को नाकाम कर सकते हैं
  • कोई कचरा संग्रहण होता है
  • प्रक्रिया दुर्घटनाओं

(नोट: समय मूल्य but were certainly true some time ago के साथ बदल सकते हैं।)

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

+0

क्या आप और उद्धृत कर सकते हैं महत्वपूर्ण भागों में से? और हाँ, शायद पूछताछकर्ता वास्तव में उस लिंक की प्रतीक्षा कर रहा था। ;) – mafu

+0

दरअसल, चूंकि बहुत से लोग पूछते हैं कि वे अंतिम रूप व्यवहार पर भरोसा कैसे कर सकते हैं, मुझे लगता है कि मैंने * सबसे महत्वपूर्ण भाग उद्धृत किया है;) दूसरी तरफ, लेख में अन्य बॉक्स भी दिलचस्प हो सकते हैं। – OregonGhost

+0

@ ओरेगॉनहोस्ट: क्या मैं इस अधिकार को समझ रहा हूं: यदि 20 फाइनलर प्रत्येक प्रत्येक को 1.95 सेकेंड लेते हैं, तो यह डरावना डोरी है और सभी निष्पादित होंगे - 39 सेकंड लेते हैं। अगर कोई 2.05 सेकेंड लेता है, तो बाकी सभी का निष्पादन छोड़ दिया जाता है। ऐसा लगता है कि टूटा हुआ है। इसके बजाय दूसरे फाइनल में 40 सेकंड के टाइमआउट के लिए दौड़ने की अनुमति देने के उद्देश्य से 2 सेकंड से अधिक समय तक चलने वाले फाइनल में कठोर रूप से बाधा डालना एक अच्छी सुविधा होगी। लेकिन दो सेकंड के बाद चीजों को पकड़ना एक गलतफहमी प्रतीत होता है। – supercat

6

यदि कोई फाइनलाइज़र अपवाद फेंकता है, तो अन्य फाइनलर निष्पादित नहीं होंगे।

यदि आप ऑब्जेक्ट पर SuppressFinalizer पर कॉल करते हैं तो आप फाइनलाइजर्स को भी दबा सकते हैं।

से MSDN (Object.Finalize):

अंतिम रूप विधि पूरा करने से नहीं चलें या निम्न असाधारण परिस्थितियों में बिल्कुल नहीं चल सकता है:

  • एक और finalizer ब्लॉक अनिश्चित काल (चला जाता है एक अनंत लूप में, लॉक प्राप्त करने का प्रयास करता है जो इसे कभी प्राप्त नहीं कर सकता है और इसी तरह)। चूंकि रनटाइम फ़ाइनलाइज़र को पूरा करने के लिए चलाने का प्रयास करता है, इसलिए फाइनलइज़र अनिश्चित काल तक अवरुद्ध होने पर अन्य फ़ाइनलाइज़र को नहीं कहा जा सकता है।
  • प्रक्रिया रनटाइम को साफ करने का मौका दिए बिना समाप्त हो जाती है। इस मामले में, रनटाइम की प्रक्रिया समाप्ति की पहली अधिसूचना एक DLL_PROCESS_DETACH अधिसूचना है।
+0

क्या आप "अपवाद" भाग के लिए स्रोत जोड़ सकते हैं? – mafu

+0

ध्यान दें कि "एक अनंत लूप में जाता है", सीएलआर कार्यान्वयन में, "दो सेकंड से अधिक समय लगता है", जैसा कि यहां बताया गया है: http://nitoprograms.blogspot.com/2009/08/finalizers-at-process- exit.html – OregonGhost

+0

@ mafutrct - यहां देखें: http://stackoverflow.com/questions/1538630/exceptions-during-finalize-what-methodology-are-you-using-to-detect-garbage-co – Oded

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