से BeginInvoke कॉलिंग मैं एक WPF अनुप्रयोग है कि इस तरह दिखता है में कुछ कोड है। ऐसा लगता है कि इस मामले में वस्तु को यूआई थ्रेड पर BeginInvoke आग में प्रतिनिधि के सामने नष्ट कर दिया जाएगा। ऐसा लगता है कि यह काम कर रहा है। यहाँ क्या हो रहा है? क्या यह सुरक्षित है?एक नाशक
एक नाशक
उत्तर
ऐसा लगता है कि इस मामले में वस्तु नष्ट हो जाएगा से पहले BeginInvoke में प्रतिनिधि यूआई धागा
finalizer कतारों यूआई संदेश पाश करने के लिए काम पर आग लगती है। ऑब्जेक्ट से पहले अपनी अंतिम विधि विधि चलाने से समाप्त हो सकता है, वास्तविक प्रतिनिधि यूआई थ्रेड पर आक्रमण करता है, लेकिन इससे कोई फर्क नहीं पड़ता क्योंकि प्रतिनिधि को बिना किसी कतार में कतारबद्ध किया जाता है।
यहां क्या हो रहा है?
आप अंतिमकर्ता से यूआई में काम कतार कर रहे हैं।
क्या यह सुरक्षित है?
सुरक्षित एक व्यापक शब्द है। क्या मैं यह करूँगा? निश्चित रूप से नहीं। यह अजीब लगता है और अजीब लगता है कि आप अंतिम रूप से यूआई तत्वों के हेरफेर का आह्वान कर रहे हैं, विशेष रूप से यह TextBox
नियंत्रण है। मेरा सुझाव है कि आपको finalizer guarantees पर चलने की पूरी समझ मिलती है और इसकी गारंटी नहीं है। एक के लिए, फाइनलइज़र चलाने का मतलब यह नहीं है कि वस्तु तुरंत स्मृति में साफ हो जाती है।
मैं भी @EricLippert पदों पढ़ने का सुझाव चाहते हैं: क्यों सब कुछ आप को पता गलत है, Part1 & Part2
finalizers के बारे में अधिक मज़ा सामान के लिएवर्ग के सदस्य के लिए पहले से ही असंभव * यह असंभव * है। हम इसे जानते हैं क्योंकि इसे एक वैध प्रबंधित संदर्भ के रूप में एक्सेस किया जा रहा है, इसलिए जीसी को इसे इकट्ठा करने की अनुमति नहीं है। यदि वह किसी भी * अनमांग * संसाधनों तक पहुंच रहा है जिसे वह पहले से ही अपने निपटारे के हिस्से के रूप में साफ कर चुका है, तो इससे समस्याएं पैदा हो सकती हैं। – Servy
@ सर्वी किसी कारण से मैंने सोचा कि एक बार एफ-पहुंच योग्य कतार में इसे मृत माना जाता है (रूट नहीं)। मैंने अप्रासंगिक हिस्सा हटा दिया। वास्तव में विपरीत –
। तथ्य यह है कि यह freachable कतार में है मतलब है कि यह बहुत ज़िंदा है। यह अंतिमकरण के लिए अपना स्वचालित पंजीकरण खो गया होगा, हालांकि अगर BeginInvoke को भेजी गई विधि वस्तु को पुनरुत्थित करने के लिए समाप्त होती है, तो इसे अंतिम रूप देने के लिए पुनः पंजीकरण करने की आवश्यकता हो सकती है। मुख्य समस्या यह है कि एक बार अंतिम रूप देने पर * जब * ऐसा होता है तो आप सभी भावनाओं को खो देते हैं। यदि आवेदन फेंक दिया जा रहा है, तो * आप * प्रेषक के लिए और अधिक काम क्यों करेंगे? ** यह निश्चित रूप से करने का गलत तरीका है जो भी किया जा रहा है! ** –
जब आप BeginInvoke
पर कॉल करते हैं तो आप प्रेषक में एक कतार में एक प्रतिनिधि जोड़ रहे हैं, और वह प्रतिनिधि उस ऑब्जेक्ट को इंगित कर रहा है जिस पर ऑब्जेक्ट का संदर्भ है Dispose
पर कॉल किया गया था। चूंकि एक रूट चर के माध्यम से सुलभ वस्तु का संदर्भ है, यह ऑब्जेक्ट संग्रह के लिए योग्य नहीं है।
अब, यह इस कोड का उपयोग कर दूसरों के लिए बेहद भ्रमित होने वाला है, इसलिए आपको "पुनर्मिलन" वस्तुओं से बचने की कोशिश करनी चाहिए जो संभवतः अंतिम रूप से अंतिम रूप दिए गए हैं।
यह इस बात पर निर्भर करता है कि वह फ़ंक्शन के अंदर क्या करता है वहाँ ... यह वस्तु को पुन: जीवंत नहीं कर सकता है ... –
@AK_ यह कम से कम ऑब्जेक्ट को क्रियान्वित करने तक ऑब्जेक्ट को फिर से चालू कर रहा है, और चूंकि यह विधि ऑब्जेक्ट को वैध ऑब्जेक्ट के रूप में पेश करने का प्रयास कर रही है, इसे निपटाने के बाद, मैं उस पुनर्मिलन का एक रूप मानूंगा। बेशक, यह मूल रूप से एक वाक्यांश है जो तकनीकी नहीं है, और इसलिए सटीक नहीं है। जैसा कि पहले कहा गया था, सटीक बयान यह है कि ऑब्जेक्ट को तब तक एकत्र नहीं किया जा सकता जब तक कि उस प्रतिनिधि के पास ऑब्जेक्ट का एक (अप्रत्यक्ष) संदर्भ हो। – Servy
प्रतिनिधि वस्तु का संदर्भ क्यों रखेगा? –
- 1. नाशक
- 2. नाशक
- 3. नाशक जब एक स्थानीय उदाहरण
- 4. स्थिर नाशक
- 5. संकलक त्रुटि जब नाशक एक ही कक्षा
- 6. uint32_t नाशक वापसी मान
- 7. सी ++ डिफ़ॉल्ट नाशक
- 8. कक्षा नाशक समस्या
- 9. डिफ़ॉल्ट शुद्ध आभासी नाशक
- 10. सी ++ inplace नाशक चेतावनी
- 11. सशर्त तुच्छ नाशक
- 12. व्यवहार नाशक को
- 13. सी ++ नाशक व्यवहार
- 14. नाशक और unique_ptr
- 15. C++ निर्माता/नाशक परिभाषा
- 16. विनाश जब नाशक
- 17. जब वास्तव में नाशक सी ++
- 18. संदर्भ और ग में नाशक ++
- 19. वापसी मूल्य अनुकूलन - - सी ++ नाशक
- 20. क्यों नाशक केवल एक बार बुलाया गया है?
- 21. एक संरक्षित निर्माता \ नाशक साथ std :: shared_ptr का उपयोग कर
- 22. सी #/CLI: नाशक अगर निपटान() में यह
- 23. विरासत पदानुक्रम: निर्माता और नाशक निष्पादन अनुक्रम
- 24. नाशक noexcept (गलत) के रूप में चिह्नित
- 25. सी ++ नाशक और समारोह कॉल आदेश
- 26. एसटीएल वेक्टर एक नहीं आवंटित वस्तु का एक नाशक बुला है?
- 27. फोर्स जावा मेरी सी ++ नाशक (JNI) कॉल करने के लिए
- 28. कैसे करता है सी में आभासी नाशक काम ++
- 29. वाहक: से निपटने के प्रति निर्माता और नाशक (C++)
- 30. रखना एक नाशक पर कि क्या कोई अपवाद घटित आधार पर भिन्न कार्यवाही ले
, बाहर की जाँच [जब सब कुछ आप को पता गलत है, भाग दो] (http://ericlippert.com/2015/05/21/when-everything-you-now-is-wrong-part-two/) – Default
यह वस्तु पुनरुत्थान है। मैंने पहले कभी अभ्यास में नहीं देखा है। शायद, आपके टेक्स्टबॉक्स को * अंतिम * नहीं होना चाहिए (आप क्या करने की कोशिश कर रहे हैं?)। – usr
एक बुरा विचार होने के अलावा, मुझे इसके लिए कोई अच्छा उपयोग नहीं दिख रहा है ... –