पृष्ठभूमि का एक छोटा सा हिस्सा: मेरे पास एक WPF एप्लिकेशन है, जो विरासत Win32-application के लिए एक जीयूआई-फ्रंट-एंड है। विरासत ऐप एक अलग थ्रेड में डीएलएल के रूप में चलता है। यूआई में उपयोगकर्ता द्वारा चुने गए आदेशों को उस "विरासत धागे" पर बुलाया जाता है।Application.Current.Shutdown() बनाम आवेदन। वर्तमान। डिस्पैचर। बेजिन इनवोकशूटडाउन()
यदि "विरासत धागा" खत्म हो जाता है, तो जीयूआई-फ्रंट एंड अब कुछ भी उपयोगी नहीं कर सकता है, इसलिए मुझे WPF-application को बंद करने की आवश्यकता है। इसलिए, थ्रेड की विधि के अंत में, मैं Application.Current.Shutdown()
पर कॉल करता हूं।
चूंकि मैं मुख्य धागे पर नहीं हूं, इसलिए मुझे इस आदेश को आमंत्रित करने की आवश्यकता है। हालांकि, मैंने देखा कि प्रेषक को बंद करने के लिए डिस्पैचर में BeginInvokeShutdown()
भी है। तो मेरे सवाल है: क्या
Application.Current.Shutdown();
लागू और बुला बीच का अंतर है
Application.Current.Dispatcher.BeginInvokeShutdown();
ठीक है, यह सटीक रूप से प्रश्न है जिसका दस्तावेज़ीकरण में उत्तर नहीं दिया गया है: क्या एप्लिकेशन के प्रेषक को बंद करना एप्लिकेशन को बंद कर देता है? –
मैंने इसके लिए एक सरल WPF परीक्षण अनुप्रयोग बनाया। अपने कोड को अनुकरण करने के लिए, मैंने किया: 'थ्रेड टी = नया थ्रेड (नया थ्रेडस्टार्ट (प्रतिनिधि() {थ्रेड स्लीप (50000);}); t.Start(); Application.Current.Dispatcher .BginginInvokeShutdown (System.Windows.Threading.DispatcherPriority.Normal); '। डिस्पैचर शट डाउन ने अपने मालिक थ्रेड को मार दिया और खिड़की बंद कर दी, लेकिन पृष्ठभूमि थ्रेड को मार नहीं दिया *। – JustABill
दो छोटे मतभेद: 1) मैं दूसरे धागे में शट डाउन कॉल करता हूं (हालांकि परीक्षण के माध्यम से मैं देख सकता हूं कि इससे कोई फर्क नहीं पड़ता)। 2) मेरे पास पृष्ठभूमि थ्रेड (IsBackground = true) के रूप में दूसरा थ्रेड सेट है। इस तरह, मुख्य धागा छोड़ देता है, तो यह भी मार जाता है। –