2010-03-12 16 views
5

एक बहु-थ्रेडेड एप्लिकेशन को साफ तरीके से पूरा करने का सबसे अच्छा तरीका क्या है?
मैं अलग-अलग सॉकेट में मुख्य धागे से कई सॉकेट कनेक्शन शुरू कर रहा हूं और मुख्य थ्रेड में अपने व्यावसायिक दिन के अंत तक प्रतीक्षा कर रहा हूं और इसे समाप्त करने के लिए वर्तमान में System.Environment.Exit(0) का उपयोग कर रहा हूं।मल्टी-थ्रेडिंग - प्रोग्राम अंत में क्लीनअप रणनीति

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

http://www.yoda.arachsys.com/csharp/threads/

विशेष रूप से "शान से कार्यकर्ता धागे शटडाउन हो रहा है":

http://www.yoda.arachsys.com/csharp/threads/shutdown.shtml

उत्तर

2

manualy बनाया धागे आप IsBackground गुण सेट चाहिए

+5

बनाना आपके सभी कार्यकर्ता धागे पृष्ठभूमि धागे प्रक्रिया रास्ते के रूप में मौत के किसी भी रोता से बचने के सकता है, लेकिन यह शायद ही सुंदर है। एक बार सभी अग्रभूमि धागे समाप्त होने के बाद, पृष्ठभूमि धागे को समाप्त कर दिया जाता है, भले ही वे कुछ करने के बीच में हों। – OldFart

+0

मैंने इसे कार्यान्वित किया है और मैं सोमवार को इसका परीक्षण करूंगा। – weismat

+0

परीक्षण और एक आकर्षक की तरह काम किया। – weismat

4

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

पीएस सभी थ्रेड पूल धागे पृष्ठभूमि हैं।

+1

बहुत बहुत अच्छा संसाधन। थ्रेडिंग अवधारणाओं के बहुत से समझने के लिए http://www.albahari.com/threading/ पर भी एक नज़र डालें। – Digicoder

0

जब भी आप लंबे समय से अवरुद्ध प्रतीक्षा करते हैं (जैसे आने वाले कनेक्शन की प्रतीक्षा करना) विधि के प्रारंभ/समाप्ति फॉर्म का उपयोग करें। फिर 'बाहर निकलना' स्थिति का प्रतिनिधित्व करने के लिए मैन्युअल रीसेट इवेंट का उपयोग करें। फिर AsyncWaitHandle और बाहर निकलने की घटना पर अवरुद्ध करें। यह आपको साफ से समाप्त करने की अनुमति देगा।

उदाहरण:

// exit is a ManualResetEvent 
var asyncResult = socket.BeginAccept(null, null); 
if(WaitHandle.WaitAny(new[] { exit, asyncResult.AsyncWaitHandle }) == 0) 
    return; 
var connection = socket.EndAccept(asyncResult); 

और अपने मुख्य विधि में जब आप छोड़ना चाहते:

exit.Set(); 
संबंधित मुद्दे