2008-12-24 11 views
11

या यह ऐसा कुछ करने के लिए ठीक है:क्या किसी को हमेशा सी # में चल रहे थ्रेड ऑब्जेक्ट का संदर्भ रखना चाहिए?

new Thread(new ThreadStart(delegate { DoSomething(); })).Start(); 

?

मुझे याद है कि इस तरह के परिदृश्य के तहत, थ्रेड ऑब्जेक्ट कचरा इकट्ठा किया जाएगा, लेकिन अंतर्निहित ओएस थ्रेड तब तक जारी रहेगा जब तक प्रतिनिधि में इसका अंत नहीं हो जाता। मैं मूल रूप से थ्रेडपूल कार्यक्षमता की तलाश में हूं, लेकिन नहीं चाहता कि धागे पृष्ठभूमि धागे हों (यानी मैं चाहता हूं कि वे ऐप को जीवित रखें)।

अद्यतन: जेसन के मुताबिक, सीएलआर वास्तव में चलने के दौरान थ्रेड ऑब्जेक्ट का आंतरिक संदर्भ रखता है, इसलिए थ्रेड से बाहर होने तक कचरा नहीं होगा।

+1

इस बारे में सोचने का एक तरीका, "अनाथ धागे में निष्पादन तर्क कैसे सिस्टम को कॉल करने में सक्षम होगा। थ्रेडिंग। थ्रेड.क्यूरेंट थ्रेड अगर ऑब्जेक्ट मौजूद नहीं था?" –

+0

जेसन, आप मानते हैं कि किसी को यह जांचने के लिए पहले स्थान पर कोशिश करने का विचार होगा। ... मेरा मतलब है _I_, निश्चित रूप से हे .. हे ... erm ... = ( –

उत्तर

11

मुझे आम तौर पर पता चला है कि अगर मुझे धागे से एक को पकड़ने के बजाय, आपके उदाहरण में सीधे एक नया धागा शुरू करने की आवश्यकता है पूल, तो यह एक लंबे समय तक चलने वाला धागा है और इसे बाद में इसे मारने, इसे मॉनीटर करने के लिए इसके संदर्भ की आवश्यकता होगी। पृष्ठभूमि थ्रेड आदि पर आईओओ को आविष्कार करने जैसे छोटे रन थ्रेड के लिए, मैं हमेशा थ्रेड पूल थ्रेड का उपयोग करता हूं (आमतौर पर परोक्ष रूप से एक someDelete.BeginBlah (...) विधि कॉल के माध्यम से)। इस तरह थ्रेड पूल थ्रेड का उपयोग करते समय मैं एक संदर्भ नहीं रखना पसंद करता हूं। मुझे नहीं पता कि कोई अन्य प्रोग्रामर उस धागे के संदर्भ का अनुचित तरीके से उपयोग कर सकता है या नहीं। अगर मुझे संदर्भ की आवश्यकता नहीं है, तो मैं इसे कोड को अव्यवस्थित करने के लिए नहीं रखता हूं।

संपादित करें: धागे को एकत्रित धागे के बारे में आपके संपादन का उत्तर देने के लिए, यह थ्रेड चलने के दौरान नहीं होगा। सीएलआर प्रत्येक चल रहे धागे का संदर्भ रखता है। धागे का प्रतिनिधित्व करने वाली वस्तु एकत्र नहीं की जाएगी।

+0

आह ठंडा, यह नहीं कि यह इस विशेष मामले में महत्वपूर्ण है, लेकिन संभवतः इसे बाहर निकलने के बाद एकत्र किया जाएगा, है ना? – devios1

+0

हां। थ्रेड ऑब्जेक्ट का संदर्भ वास्तविक निष्पादन थ्रेड के साथ स्टैक पर रखा गया है। एक बार वास्तविक धागा पूरा हो जाने पर तो अगर मैं अपने रिचटर को सही ढंग से याद करता हूं तो थ्रेड ऑब्जेक्ट का कोई संदर्भ नहीं होगा। मैंने पढ़ा है कि सीएलआर में सी # या सी # के माध्यम से संक्षेप में। दोनों महान किताबें। –

2

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

+0

रद्द करना जरूरी नहीं है - यह एक पृष्ठभूमि (सिंक) ऑपरेशन है, लेकिन मैं चाहता हूं कि यह ऐप को शटडाउन पर जिंदा रखे यह छोड़ने से पहले एक अंतिम सिंक कर सकता है। मैं थ्रेडपूल का उपयोग कर रहा था जब तक कि मुझे एप छोड़ने का एहसास नहीं हुआ था। – devios1

0

प्रश्न पूछना अच्छा होगा "यह धागा कितनी बार शुरू हो सकता है?" क्या यह प्रति-अनुप्रयोग, प्रति-वर्ग, प्रति-वस्तु उदाहरण, या प्रति-विधि आमंत्रण है? यह आपको बता सकता है कि इसमें किस प्रकार का चर (यदि कोई है) इसे स्टोर करने के लिए।

+0

असल में मैं उस लाइन को प्रत्येक ~ 5 मिनट के शेड्यूल पर निष्पादित कर रहा हूं, और चिंतित हूं कि यह रिसाव होगा, या यदि धागे ठीक से चलेंगे। – devios1

+0

क्या धागा रिसाव होगा (या बदतर, केवल अनंतता के लिए लूप) यह निष्पादित कोड पर निर्भर करता है। क्या एनन थ्रेड को स्पिन करना ठीक है, यह कोड चलने वाले कोड पर निर्भर करता है। – Chris

0

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

तो सच में, आप इसे अपना रास्ता कर सकते हैं, इसलिए उत्तर वास्तव में कोड शैली वरीयता पर आता है।

0

"m3rLinEz" ऊपर क्या पोस्ट किया गया है इसके अतिरिक्त, एक और ड्रॉ बैक यह है कि यदि आपके धागे में कोई अपवाद होता है तो ऐसे मामलों का पता लगाना मुश्किल होगा।

1

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

और, दूसरे भाग में, यह चलने के दौरान जीसीडी नहीं होगा; धागे रूट स्तर की वस्तुएं हैं जिनसे जीसीटीआर संदर्भों का पीछा करेगा। थ्रेड इंस्टेंस केवल जीसीडी होगा जब यह आपके द्वारा शुरू किए जाने वाले किसी भी चल रहे थ्रेड द्वारा अब तक पहुंच योग्य नहीं होगा।

और थ्रेड उदाहरणों को लीक करने से सावधान रहें जो बनाए गए हैं लेकिन कभी शुरू नहीं हुए। मुझे विश्वास है कि वे हमेशा के लिए लटका होगा।

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