2009-11-10 16 views
7

एक नया सिस्टम बनाते समय। थ्रेड उदाहरण IsBackground का डिफ़ॉल्ट मान गलत है। क्या कोई इस पर प्रकाश डाल सकता है कि यह डिफ़ॉल्ट मूल्य क्यों सही नहीं होगा। मेरा झुकाव, सही या नहीं, जब धागा बनाते हैं तो यह मुख्य धागे की पृष्ठभूमि में चलाया जाएगा।सी # थ्रेड निर्माण प्रश्न

त्वरित प्रतिक्रियाओं के लिए धन्यवाद।

मैं धागे को सुगंधित रूप से समाप्त करने की अनुमति देने के लिए अपने घटक के विनाशक में कार्यक्षमता प्रदान करता हूं। मैं ManualResetEvent और Join का उपयोग कर रहा हूं।

मैं पूरी तरह से समझता हूं कि थ्रेड को सुदृढ़ रूप से समाप्त करने की अनुमति देना सही और उचित है। जो मैं संकल्पनात्मक नहीं कर रहा हूं वह यह है कि क्यों। डिफ़ॉल्ट रूप से, एक थ्रेड को पूरे एप्लिकेशन को लटका देना चाहिए यदि एप्लिकेशन बाहर निकलने पर सफलतापूर्वक समाप्त नहीं होता है।

उत्तर

22

IsBackground का अर्थ है कि थ्रेड समाप्त हो गया है जब एप्लिकेशन समाप्त हो जाता है। यह शायद ही कभी वांछनीय व्यवहार है, क्योंकि इसका मतलब है कि धागा ठीक से बंद नहीं हो सकता है और साफ कर सकता है।

इसके बजाय, ऐप को थ्रेड को समाप्त करने के लिए संकेत देना चाहिए, ऐसा करने तक प्रतीक्षा करें, और फिर ठीक से बंद करें।

Thread.IsBackground MSDN article से इस blurb के अपने सारांश है कि:

एक धागा या तो एक पृष्ठभूमि धागा या एक अग्रभूमि धागा है। पृष्ठभूमि धागे अग्रभूमि धागे के समान हैं, सिवाय इसके कि पृष्ठभूमि धागे से प्रक्रिया को रोक नहीं सकते हैं। एक बार सभी अग्रभूमि किसी प्रक्रिया से संबंधित धागे समाप्त हो गए हैं, सामान्य भाषा रनटाइम प्रक्रिया समाप्त होती है। कोई भी शेष पृष्ठभूमि धागे बंद कर दिया गया है और पूरा नहीं हुआ है।

4

IsBackground पर एमएसडीएन पृष्ठ से यह जानकारी पृष्ठभूमि और अग्रभूमि धागे के बीच अंतर बताती है।

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

2

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

यदि आप पृष्ठभूमि थ्रेड में त्वरित कार्य आइटम को चलाने के लिए चाहते हैं, तो थ्रेडपूल का उपयोग करें। यह आमतौर पर ऐसी किसी भी चीज़ के लिए बेहतर होगा जो लंबे समय तक चलने वाली कार्य वस्तु नहीं है।

+0

या पृष्ठभूमिवर्कर वर्ग का उपयोग करें। – TheSean

+0

पृष्ठभूमिवर्कर थ्रेडपूल का उपयोग करता है, जैसा कि .NET 4 में नया कार्य प्रतिमान है, इसलिए मैं थ्रेडपूल का उपयोग करने के हिस्से के रूप में उन सभी का इलाज कर रहा था। –

0

> मैं पूरी तरह से समझते हैं कि धागा शान से समाप्त करने के लिए अनुमति देता है सही और उचित है, लेकिन मैं क्या याद आ रही है यही कारण है कि डिफ़ॉल्ट रूप से एक धागा एक पूरे आवेदन लटका चाहिए अगर यह सफलतापूर्वक खत्म नहीं होता है। < <

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

2

अग्रभूमि बनाम पृष्ठभूमि की अवधारणा थोड़ा उलझन में हो सकती है। जैसा कि अन्य ने पृष्ठभूमि पहलू को इंगित किया है केवल यह प्रभावित करता है कि रनटाइम प्रक्रिया को बंद कर देगा या नहीं। यदि कोई फोरग्राउंड थ्रेड नहीं रहता है, तो आखिरी अग्रभूमि थ्रेड समाप्त हो जाने पर यह चलने वाले पृष्ठभूमि धागे की संख्या के बावजूद प्रक्रिया को बंद कर देगा।

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

आप निश्चित रूप से पृष्ठभूमि/अग्रभूमि और नए धागे की प्राथमिकता दोनों सेट कर सकते हैं, लेकिन डिफ़ॉल्ट यह है कि नए धागे प्रारंभिक धागे के बराबर हैं।

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