2011-02-15 10 views
30

मेरे पास सी # और जे # का कुछ वास्तव में बड़ा एप्लिकेशन मिश्रण है।आवेदन द्वारा खोले गए सभी थ्रेडों को मारना

कभी-कभी जब मैं इसे बंद करता हूं, तो कुछ थ्रेड बंद नहीं होते हैं और वे कार्य प्रबंधक में लटक रहे हैं और उन्हें वहां से मारना असंभव है।

मुझे उन सभी धागे को खोजने और उन्हें समापन घटना में जोड़ने में वास्तव में समस्या है।

वहाँ किसी तरह हिंसक मारने सभी धागे कि समापन समारोह में आवेदन के द्वारा खोले गए? ...

धन्यवाद है।

क्या शायद कुछ टूल है जो मुझे बता सकता है कि जब मैं एप्लिकेशन बंद करता हूं और किसने उन्हें खोल दिया तो क्या थ्रेड खोले जाते हैं?

+0

यह भी देखें: [एक बहुप्रचारित एप्लिकेशन को बंद करना] (http: // stackoverflow।कॉम/प्रश्न/2314861/शट-डाउन-ए-मल्टीथ्रेडेड-एप्लिकेशन) –

उत्तर

42

यह नहीं हो रहा है, और यदि ऐसा है, तो आप इसे गलत तरीके से संबोधित करने की कोशिश कर रहे हैं।

जब आपका आवेदन निकलता है, तो .NET Framework स्वचालित रूप से किसी भी थ्रेड को मार देगा जिसका IsBackground property "True" पर सेट है। अपने प्रत्येक कार्यकर्ता धागे को पृष्ठभूमि धागे के रूप में नामित करें, और अब आपको यह समस्या नहीं होगी। BackgroundWorker class और ThreadPool class का लाभ उठाते हुए, जो स्वचालित रूप से पृष्ठभूमि धागे बनाते हैं, एक बेहतर विकल्प है।

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

प्रक्रिया को मारना एक बहुत बुरा विचार है, क्योंकि आपके धागे आपके आवेदन में willy-nilly के बारे में बता रहे हैं।

+2

यह मेरे लिए काम करता है –

+0

वैसे हाँ यह अच्छा स्पष्टीकरण है .... लेकिन क्या होगा यदि आप एक थ्रेड से डब्ल्यूसीएफ वेब सेवा कहते हैं जहां सेवा कुछ अपरिभाषित स्थिति में फंस गई है। आप अंतहीन इंतजार नहीं कर सकते। आपको उस धागे को मारना होगा। कोई दूसरा रास्ता नहीं है या मैं गलत हूँ? – Patrik

+2

आप धागे को नहीं मारते हैं, आप टाइमआउट के साथ वेब सेवा को कॉल करते हैं। @patrik –

4

ठीक है, आप Application.Exit() पर कॉल कर सकते हैं लेकिन यह बहुत मदद नहीं करेगा। निचली पंक्ति यह है कि यदि आप चीजों को सही तरीके से करना चाहते हैं तो आपको अपने सभी धागे को गर्व से बंद करना होगा।

+1

काम नहीं किया। मुझे लगता है कि आपका मतलब 'पर्यावरण। एक्सिट() 'दूसरे उत्तर में है, जो काम करता है। –

0

मेरे 2 सेंट ... सभी प्रश्नों के उत्तर के लिए ...

कोशिश बंद

void CurrentApplication_Exit(object sender, ExitEventArgs e) में रखो और private void Window_Closing(object sender, CancelEventArgs e) उन पंक्तियों

System.Windows.Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown; 
System.Windows.Application.Current.Shutdown(); 
13

आप उपयोग कर सकते हैं के लिए मजबूर करने: Environment.Exit (0); , अगर थ्रेड चल रहे हैं और किसी भी समस्या का कारण नहीं है तो एप्लिकेशन को बंद कर देगा।

+0

यह थ्रेड की 'IsBackground' प्रॉपर्टी सेट करने के साथ-साथ काम करता है 'True' –

0
internal void Close() 
{ 
    Dispatcher.CurrentDispatcher.Thread.Abort(); 
    Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown; 
    Application.Current.Shutdown(); 
} 
+0

पर सेट किया गया है लेकिन यह बेहतर वातावरण दिखता है। एक्सिट (0); – Mario

+8

यदि आप कोड के ब्लॉक में विवरण जोड़ते हैं तो उत्तर अधिक उपयोगी होगा। – kukido

1

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

अपने OnClose हैंडलर पर

:

System.Diagnostics.Process.GetCurrentProcess().Kill(); 

मैं पूरी तरह पसंद करते हैं इसे करने के कोडी ग्रे रास्ता।

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