2008-10-03 19 views
5

को पुनरारंभ करने से रोकता है हमारे पास सी # में एक स्मार्ट क्लाइंट बनाया गया है जो पीसी चालू होने पर पुन: प्रारंभ होता है। यह पुनरारंभ प्रक्रिया को तब तक रोकता है जब तक कि उपयोगकर्ता स्मार्टक्लेंट को बंद नहीं करता है या कुछ अन्य मैन्युअल हस्तक्षेप होता है।सी # पीसी रीस्टार्ट होने पर .NET exe बंद नहीं होता है, मशीन को

यह समस्याएं पैदा कर रहा है जब आधारभूत संरचना टीम दूरस्थ रूप से नए सॉफ़्टवेयर को स्थापित करती है जिसके लिए मशीन रीबूट की आवश्यकता होती है।

स्मार्ट क्लाइंट ऐप को विंडोज़ से शटडाउन/पुनरारंभ करने की घटना को पहचानने और खुद को मारने के लिए कोई विचार है?

अद्यतन: यह एकाधिक गुई धागे के साथ एक अत्यधिक थ्रेडेड एप्लिकेशन है। हाँ, एकाधिक गुई धागे। यह वास्तव में कई परियोजनाओं का एकीकरण है कि स्वयं में और स्वयं एकमात्र अनुप्रयोग हो सकते हैं - जिनमें से सभी एक एकल exe से लॉन्च और प्रबंधित किए जाते हैं जो उन प्रबंधन विधियों को केंद्रीकृत करता है और उन धागे का ट्रैक रखता है। मुझे पृष्ठभूमि धागे का उपयोग करने पर विश्वास नहीं है एक विकल्प है।

+0

क्या आप गैर-पृष्ठभूमि धागे पर सामान चला रहे हैं? – Will

+0

क्या आपके पास SmartClient ऐप के स्रोत स्रोत तक पहुंच है? –

उत्तर

5

ठीक है, आप अनुप्रयोग के लिए उपयोग किया है, तो आप SessionEnded घटना संभाल कर सकते हैं।

... 
Microsoft.Win32.SystemEvents.SessionEnded +=new 
    Microsoft.Win32.SessionEndedEventHandler(shutdownHandler); 

... 

private void shutdownHandler(object sender, Microsoft.Win32.SessionEndedEventArgs e) { 
    // Do stuff 
} 
+1

बस एक नोट: आप शायद सत्र समाप्ति कार्यक्रम चाहते हैं, सत्र सत्र नहीं (यदि आपको धागे और करीबी रूपों को निरस्त करने की आवश्यकता है)। कुछ नया सीखने के लिए – Sire

+0

+1। – Ikaso

0

आम तौर पर एक .Net ऐप सही ढंग से प्रतिक्रिया देगा - कम से कम, यह 'बॉक्स से बाहर' व्यवहार है। यदि ऐसा नहीं है, तो कई चीजें चल रही हैं। आपके प्रोग्राम के बारे में कुछ और जानने के बिना मेरा सबसे अच्छा अनुमान यह है कि आपके पास मुख्य यूआई थ्रेड में चलने वाली लंबी चल रही प्रक्रिया है जो ऐप को विंडो संदेशों का जवाब देने से रोक रही है।

+0

लंबे समय तक चलने वाली प्रक्रिया नहीं है लेकिन ऊपर वर्णित कैटलिन के रूप में थ्रेडिंग है। फिर भी, यह वास्तव में सवाल का जवाब नहीं देता है - मैं वास्तव में मशीन को पुनरारंभ करने के दौरान पता लगाने का एक तरीका ढूंढ रहा हूं। – ScottCher

1

या शायद .Net ऐप बंद करने या उद्देश्य पर संदेशों को छोड़कर अनदेखा कर रहा है?

+0

यह एक टिप्पणी है imo – Konstantinos

5

यह एक थ्रेड होना चाहिए जो आपके एप्लिकेशन को बंद करने से रोकता है। यदि आप थ्रेडिंग का उपयोग कर रहे हैं तो एक आसान फिक्स पृष्ठभूमि पर सेट करना होगा।

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

http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground.aspx

+0

दरअसल, यह एक थ्रेडेड ऐप है। मूल पोस्ट में अपडेट देखें। हालांकि, हम धागे के साथ क्या कर रहे हैं, क्या उन्हें पृष्ठभूमि अभी भी व्यवहार्य है? हां, एकाधिक जीयूआई धागे। – ScottCher

1

पृष्ठभूमि धागे एक त्वरित और गंदे समाधान था, सबसे अच्छा समाधान तुल्यकालन वस्तुओं (ManualResetEvent, Mutex या कुछ और) अन्य धागे को रोकने के लिए उपयोग करने के लिए है,

अन्यथा अपनी सभी खुली खिड़कियों का ट्रैक रखें और मुख्य ऐप बंद होने पर WM_CLOSE संदेश भेजा।

आपको उन जीयूआई अनुप्रयोगों को शुरू करने के तरीके के बारे में अधिक जानकारी देना है। हो सकता है कि आप प्रत्येक एप्लिकेशन के लिए एक थ्रेड शुरू करें और Application.Run(new Form1()); पर कॉल करें?

आप प्रत्येक जीयूआई आवेदन

5

जब कोई उपयोगकर्ता बंद प्रवेश करने जाता है या Windows बंद किया जा रहा है के लिए एक AppDomain बनाने में लग सकते हैं, WM_QUERYENDSESSION संदेश सभी उच्च-स्तरीय खिड़कियों को भेजा जाता है।देखें MSDN documentation here.

इस संदेश के जवाब में WinForm एप्लिकेशन का डिफ़ॉल्ट व्यवहार CloseReason == WindowsShutDown या अन्य के साथ FormClosing ईवेंट को ट्रिगर करना है। इवेंट हैंडलर यद्यपि जिद्दी होने का विकल्प चुन सकता है और ऐप को बंद करने से इंकार कर सकता है, इस प्रकार सिस्टम को चालू रखता है।

अपने अनुप्रयोगों के FormClosing हैंडलर देखें। शायद वहां कुछ है। मैंने इस तरह की चीजें दो बार देखी हैं।