2015-05-27 12 views
7

से BeginInvoke कॉलिंग मैं एक WPF अनुप्रयोग है कि इस तरह दिखता है में कुछ कोड है। ऐसा लगता है कि इस मामले में वस्तु को यूआई थ्रेड पर BeginInvoke आग में प्रतिनिधि के सामने नष्ट कर दिया जाएगा। ऐसा लगता है कि यह काम कर रहा है। यहाँ क्या हो रहा है? क्या यह सुरक्षित है?एक नाशक

+0

, बाहर की जाँच [जब सब कुछ आप को पता गलत है, भाग दो] (http://ericlippert.com/2015/05/21/when-everything-you-now-is-wrong-part-two/) – Default

+0

यह वस्तु पुनरुत्थान है। मैंने पहले कभी अभ्यास में नहीं देखा है। शायद, आपके टेक्स्टबॉक्स को * अंतिम * नहीं होना चाहिए (आप क्या करने की कोशिश कर रहे हैं?)। – usr

+0

एक बुरा विचार होने के अलावा, मुझे इसके लिए कोई अच्छा उपयोग नहीं दिख रहा है ... –

उत्तर

4

ऐसा लगता है कि इस मामले में वस्तु नष्ट हो जाएगा से पहले BeginInvoke में प्रतिनिधि यूआई धागा

finalizer कतारों यूआई संदेश पाश करने के लिए काम पर आग लगती है। ऑब्जेक्ट से पहले अपनी अंतिम विधि विधि चलाने से समाप्त हो सकता है, वास्तविक प्रतिनिधि यूआई थ्रेड पर आक्रमण करता है, लेकिन इससे कोई फर्क नहीं पड़ता क्योंकि प्रतिनिधि को बिना किसी कतार में कतारबद्ध किया जाता है।

यहां क्या हो रहा है?

आप अंतिमकर्ता से यूआई में काम कतार कर रहे हैं।

क्या यह सुरक्षित है?

सुरक्षित एक व्यापक शब्द है। क्या मैं यह करूँगा? निश्चित रूप से नहीं। यह अजीब लगता है और अजीब लगता है कि आप अंतिम रूप से यूआई तत्वों के हेरफेर का आह्वान कर रहे हैं, विशेष रूप से यह TextBox नियंत्रण है। मेरा सुझाव है कि आपको finalizer guarantees पर चलने की पूरी समझ मिलती है और इसकी गारंटी नहीं है। एक के लिए, फाइनलइज़र चलाने का मतलब यह नहीं है कि वस्तु तुरंत स्मृति में साफ हो जाती है।

मैं भी @EricLippert पदों पढ़ने का सुझाव चाहते हैं: क्यों सब कुछ आप को पता गलत है, Part1 & Part2

finalizers के बारे में अधिक मज़ा सामान के लिए
+0

वर्ग के सदस्य के लिए पहले से ही असंभव * यह असंभव * है। हम इसे जानते हैं क्योंकि इसे एक वैध प्रबंधित संदर्भ के रूप में एक्सेस किया जा रहा है, इसलिए जीसी को इसे इकट्ठा करने की अनुमति नहीं है। यदि वह किसी भी * अनमांग * संसाधनों तक पहुंच रहा है जिसे वह पहले से ही अपने निपटारे के हिस्से के रूप में साफ कर चुका है, तो इससे समस्याएं पैदा हो सकती हैं। – Servy

+0

@ सर्वी किसी कारण से मैंने सोचा कि एक बार एफ-पहुंच योग्य कतार में इसे मृत माना जाता है (रूट नहीं)। मैंने अप्रासंगिक हिस्सा हटा दिया। वास्तव में विपरीत –

+0

। तथ्य यह है कि यह freachable कतार में है मतलब है कि यह बहुत ज़िंदा है। यह अंतिमकरण के लिए अपना स्वचालित पंजीकरण खो गया होगा, हालांकि अगर BeginInvoke को भेजी गई विधि वस्तु को पुनरुत्थित करने के लिए समाप्त होती है, तो इसे अंतिम रूप देने के लिए पुनः पंजीकरण करने की आवश्यकता हो सकती है। मुख्य समस्या यह है कि एक बार अंतिम रूप देने पर * जब * ऐसा होता है तो आप सभी भावनाओं को खो देते हैं। यदि आवेदन फेंक दिया जा रहा है, तो * आप * प्रेषक के लिए और अधिक काम क्यों करेंगे? ** यह निश्चित रूप से करने का गलत तरीका है जो भी किया जा रहा है! ** –

3

जब आप BeginInvoke पर कॉल करते हैं तो आप प्रेषक में एक कतार में एक प्रतिनिधि जोड़ रहे हैं, और वह प्रतिनिधि उस ऑब्जेक्ट को इंगित कर रहा है जिस पर ऑब्जेक्ट का संदर्भ है Dispose पर कॉल किया गया था। चूंकि एक रूट चर के माध्यम से सुलभ वस्तु का संदर्भ है, यह ऑब्जेक्ट संग्रह के लिए योग्य नहीं है।

अब, यह इस कोड का उपयोग कर दूसरों के लिए बेहद भ्रमित होने वाला है, इसलिए आपको "पुनर्मिलन" वस्तुओं से बचने की कोशिश करनी चाहिए जो संभवतः अंतिम रूप से अंतिम रूप दिए गए हैं।

+0

यह इस बात पर निर्भर करता है कि वह फ़ंक्शन के अंदर क्या करता है वहाँ ... यह वस्तु को पुन: जीवंत नहीं कर सकता है ... –

+0

@AK_ यह कम से कम ऑब्जेक्ट को क्रियान्वित करने तक ऑब्जेक्ट को फिर से चालू कर रहा है, और चूंकि यह विधि ऑब्जेक्ट को वैध ऑब्जेक्ट के रूप में पेश करने का प्रयास कर रही है, इसे निपटाने के बाद, मैं उस पुनर्मिलन का एक रूप मानूंगा। बेशक, यह मूल रूप से एक वाक्यांश है जो तकनीकी नहीं है, और इसलिए सटीक नहीं है। जैसा कि पहले कहा गया था, सटीक बयान यह है कि ऑब्जेक्ट को तब तक एकत्र नहीं किया जा सकता जब तक कि उस प्रतिनिधि के पास ऑब्जेक्ट का एक (अप्रत्यक्ष) संदर्भ हो। – Servy

+0

प्रतिनिधि वस्तु का संदर्भ क्यों रखेगा? –

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