2009-06-23 20 views
15

थ्रेड के साथ क्या होता है यदि यह किसी ऑब्जेक्ट में कोई विधि चला रहा है जो किसी ब्लॉक का उपयोग करके मुक्त हो गया था?
उदाहरण:सी # एक थ्रेड के साथ एक प्रयोग() ब्लॉक से बाहर निकलता हुआ अभी भी स्कॉप्ड ऑब्जेक्ट पर चल रहा है

 
    using (SomeObject obj = new SomeObject()) 
    { 
     obj.param = 10 ; 
     Thread newThread = new Thread(() => { obj.Work(); }); 
     newThread.Start(); 
    } 
    ... 

obj.Work() एक नया धागा पर चल रहा है लेकिन obj एक IDisposable उद्देश्य यह है कि सामान्य रूप से जब ब्लॉक रास्ते का उपयोग कर जारी किया जायेगा है। यदि ब्लॉक का उपयोग समाप्त होने के बाद धागा चल रहा है तो क्या होता है? थ्रेड पूरा होने के बाद ही वस्तु का निपटान किया जाएगा? या धागा तोड़ देगा?

धन्यवाद।

+0

धागे के बाहर उपयोग कथन रखने के बजाय, इसे थ्रेड के अंदर रखें। थ्रेड newThread = नया थ्रेड (() => { का उपयोग कर (SomeObject obj = नए SomeObject()) { obj.param = 10; obj.Work();} }); newThread.Start(); – Relster

उत्तर

4

याद रखें कि IDisposable केवल एक पैटर्न है और वस्तु से जुड़े स्मृति को मुक्त नहीं करता है। यह मामला using ब्लॉक के करीब obj.Dispose पर कॉल करेगा और obj का उपयोग कर रहे अन्य थ्रेड को जारी रहेगा।

यह obj's के बाद से आपके लिए अजीब समस्याएं पैदा करेगा क्योंकि अन्य धागे इसका उपयोग कर रहे हैं (यह सब इस बात पर निर्भर करता है कि Dispose विधि लागू की गई है)। IDisposable, थ्रेडिंग, और using कथन का यह एप्लिकेशन कहने की जरूरत नहीं है कि सबसे अच्छा समस्याग्रस्त हो जाएगा।

1

जब उपयोग धागा मुख्य धागे पर निकलता है, तो यह ऑब्जेक्ट() ऑब्जेक्ट करेगा, जो सभी प्रकार की मजेदार सहमति समस्याओं का कारण बन सकता है। हालांकि, ऑब्जेक्ट कचरा नहीं होगा - यह रहेगा, लेकिन एक अमान्य स्थिति में, आपके कार्यान्वयन के आधार पर।()।

11

दिलचस्प चीजें घटित होंगी।

विशेष रूप से, कुछ ऑब्जेक्ट पर निपटान विधि को बुलाया जाएगा, या तो कार्य को पहले या बाद में कहा जाता है क्योंकि यह उस बिंदु से चलने के लिए निर्धारित हो सकता है या नहीं।

उसके बाद, यह कुछ ऑब्जेक्ट की निपटान विधि पर निर्भर करता है; यदि यह कहता है, एक एसक्यूएलकनेक्शन जारी करता है जिसका उपयोग 'कार्य' में नहीं किया जाता है, तो कोई समस्या नहीं होनी चाहिए; हालांकि हालांकि कुछ ऑब्जेक्ट अपेक्षा करता है कि इसका निपटारा नहीं किया गया है, तो संभवत: उस धागे में आपको एक अपवाद फेंक दिया जाएगा।

+0

दिलचस्प चीजें, अच्छा एक। – Groo

+0

किसी कारण से, यह मुझे इतालवी नौकरी में मोस डेफ के बारे में सोचता है: "मुझे बुरा अनुभव था।" –

2

ऑब्जेक्ट ब्लॉक के अंत में निपटान कॉल करेगा। यह चलना जारी रहेगा, लेकिन ओबीजे अस्थिर हो जाएगा क्योंकि निपटान कनेक्शन बंद करने का अनुमान है। अब यह संभव है कि यह जांचने के लिए ओबीजे स्थापित किया जाएगा कि क्या कुछ उपयोग में है या इसे बाद में बंद कर दें, लेकिन मैं इस पर भरोसा नहीं करता आपने इसे संभालने के लिए ऑब्जेक्ट लिखा है।

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