2009-03-30 15 views
11

चलाना जारी रखें मैं एक कंसोल एप्लिकेशन विकसित करने वाला हूं जिसे लगातार समय पर चलाने और काम करने की आवश्यकता होगी।सी # कंसोल एप्लिकेशन - इसे

मेरा प्रश्न यह है कि आपके आवेदन को जिंदा रखने के लिए सर्वोत्तम तरीके या अभ्यास क्या हैं?

मेरा विचार था: एक लूप जो कभी समाप्त नहीं होता? एक टाइमर जो सोता है और फिर आवश्यक होने पर नियमित रूप से कूदता है (सेट नींद की अवधि के बाद)?

मैं एप्लिकेशन को एक exe में संकलित कर रहा हूं और फिर इसे हमेशाUpUp का उपयोग करके सेवा के रूप में चला रहा हूं।

सादर ..

पीटर

+0

आपको कई अलग-अलग प्रकार के उत्तरों मिलने का कारण यह है कि आपने इस बात पर पूरी जानकारी नहीं दी कि यह क्या करेगा। अधिक जानकारी के साथ, आप अब तक प्रस्तुत विकल्पों में से कुछ को कम करने में सक्षम होंगे। – Cheeso

उत्तर

8

क्यों आप पहली जगह में एक सेवा के रूप में अपने ऐप्लिकेशन का निर्माण नहीं करते हैं?

+0

Windows सेवाओं का उपयोग करना चाहिए उस मॉडल के यह सबसे अच्छा यकीन नहीं का समर्थन करता है जो आप इस पर नीचे snarked है। – ojblass

2

कोड जो निरंतर चलता है उसे डेमॉन कहा जाता है और एक लेख here यह बताता है कि आप क्या पूछते हैं। यह आपको एक सरल सेवा here लिखने के उदाहरण के बारे में बताएगा।

+0

हां एक बोउट एक सेवा सोचा लेकिन मुझे नहीं लगता कि यह मेरी ज़रूरतों को पूरा करेगा क्योंकि मुझे फ़ाइलों को संसाधित करने और संग्रहित फ़ाइल से कॉन्फ़िगरेशन जानकारी पढ़ने की आवश्यकता है ताकि कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट विशिष्ट समय पर काम किया जा सके। –

3

शायद आप लूप में आसानी से उपभोग करने वाले प्रोसेसर समय में केवल स्पिन नहीं करना चाहते हैं।

मान लें कि आप विंडोज़ पर हैं, तो आपके पास एक लूप होना चाहिए जो आपकी ज़रूरतों के आधार पर WaitForSingleObject() या WaitForMultipleObjects() या MsgWaitForMultipleObjects() पर कॉल के साथ समाप्त नहीं होता है। फिर कुछ सिंक्रनाइज़ेशन ऑब्जेक्ट करें जो आपको जागृत करता है, जैसे नामित ईवेंट।

Win32 सिंक्रनाइज़ेशन दस्तावेज़ here देखें। यदि आप अपने कार्यक्रम को क्या करने की ज़रूरत है, इस पर अधिक विस्तृत जानकारी देते हैं, तो हम शायद अधिक विशिष्ट सलाह प्रदान कर सकते हैं।

+0

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

+0

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

1

ठीक है मुझे यकीन है कि किसी बिंदु पर इसे रोकना चाहिए, नहीं?

काम करने वाले धागे को स्पॉन करें, और कंसोल पर मुख्य थ्रेड ब्लॉक है। रीडलाइन() यदि आप इसे कंसोल ऐप के रूप में भी चलाने योग्य बनाना चाहते हैं।

यदि आप वास्तव में केवल मुख्य धागे को हमेशा रोकना चाहते हैं, तो बस मैन्युअल रीसेट पर रोकें जिसे आप कभी भी आग नहीं देते हैं।

लेकिन, यदि आप कर सकते हैं तो सेवा का उपयोग करने पर विचार करें।

2

यदि आपका प्रोग्राम लगातार चल रहा है तो आपको वांछित घटना होने तक सोना चाहिए (उदा। एक्सएक्स सेकेंड पास)। यदि आप बस थोड़ी देर में स्पिन करते हैं {} लूप आप CPU बार ​​चूस लेंगे।

यदि आपका प्रोग्राम हमेशा मशीन पर चल रहा है तो आपको इसे एक सेवा बनाने पर विचार करना चाहिए ताकि यह स्वचालित रूप से मशीन से शुरू हो और बंद हो जाए।

13

एक बेहतर समाधान एक कंसोल एप्लिकेशन लिखना होगा जो इसकी नौकरी और छोड़ देता है। इसके बाद आप इसे समय-समय पर चलाने के लिए विंडोज टास्क शेड्यूलर का उपयोग कर सकते हैं।

+2

बिल्कुल सहमत! जॉन गैलोवे ने थोड़ी देर बाद एक ब्लॉग पोस्ट लिखा था जिसने मुझे विश्वास दिलाया कि मैं एक कार्य के बजाय सेवा करके गलत कर रहा था: http://weblogs.asp.net/jgalloway/archive/2005/10/24/428303.aspx –

+0

मुझे लगता है कि उपयोगकर्ता उपयोगकर्ता प्रमाण-पत्रों के संदर्भ में सेवाएं अधिक लचीलापन प्रदान करती हैं। – ojblass

+0

कम से कम जहां तक ​​मैंने देखा है कि आप प्रमाण-पत्र निर्धारित कर सकते हैं कि निर्धारित कार्य निम्नानुसार होगा। आप उस सेवा के साथ क्या कर सकते हैं जिसे आप किसी कार्य के साथ नहीं कर सकते? –

1

यदि आप डेस्कटॉप एप्लिकेशन बनाते हैं तो आप इसे सिस्टम ट्रे में चलाने के लिए चाहते हैं।यह

  1. गलती से अनुप्रयोग को बंद अपने एक सर्वर अनुप्रयोग आप एक खिड़कियों सेवा लिखना चाहते हैं जाएगा निर्माण तो
  2. अपने उपयोगकर्ताओं की स्क्रीन को अव्यवस्थित

से अपने आवेदन रखें से अपने उपयोगकर्ताओं रखेंगे। यह

  1. गलती से अपने आवेदन
  2. किसी को अपने आवेदन के लिए कंसोल में लॉग इन किया है करने के लिए सर्वर की आवश्यकता को समाप्त बंद करने से एक व्यवस्थापक रखेंगे

किसी रूप में चल रहा हो जो मुख्य रूप से है एक आईटी प्रो मैं कहूंगा कि तृतीय पक्ष अनुप्रयोग जो हमें विंडोज सेवाओं की बजाय कंसोल ऐप्स के रूप में चलाते हैं, हमने खरीदे जाने से रोकने में काफी प्रयास किए हैं। यह हमारे लिए बहुत काम करता है, और महत्वपूर्ण समर्थन मुद्दों और सुरक्षा छेद खोलता है।

1

एक धागा भेजा जा रहा है सोने के लिए: System.Threading.Thread.Sleep (10000);

दबाए जाने की कुंजी की प्रतीक्षा: कंसोल। राइटलाइन ("जारी रखने के लिए कोई भी कुंजी दबाएं ..."); कंसोल। पढ़ें();

+0

थ्रेड नींद सॉफ़्टवेयर धीमी गति से आवंटित करता है और इसका उपयोग नहीं किया जाना चाहिए। आपको कंसोल ऐप के लिए AutoResetSignal का उपयोग करना चाहिए या अगर उसे पूरे समय चलाने की ज़रूरत है तो सेवा करें। – ppumkin

3

आप System.Windows.Forms पर एक संदर्भ जोड़ सकते हैं और मानक एप्लिकेशन संदेश लूप शुरू करने के लिए System.Windows.Forms.Application.Run() पर कॉल कर सकते हैं। Ctrl-C एप्लिकेशन समाप्त कर देगा।

एक अन्य विकल्प Console.ReadKey() उपयोग करने देता है को रोकने के लिए है। Console.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();

है यही कारण है कि मैं अपने सांत्वना क्षुधा में उपयोग करते हैं वे सिर्फ वहाँ बैठे रहे ईवेंट के होने का इंतज़ार कर की तरह। या तो मामले में अनुप्रयोग चलाने के लिए जारी रहेगा और पकड़ (एक टाइमर, WCF, FileWatcher, आदि से) की तरह शुरू हो रहा घटनाओं।

2

तुम सच में, इस के लिए एक सेवा का उपयोग करना चाहिए जब आप की जरूरत है/वैसे भी ऐसा करना चाहते हैं, तो आप एक ManualResetEvent उपयोग कर सकते हैं यह करने के लिए:

private ManualResetEvent Wait = new ManualResetEvent(false); 

काम पूरा हो जाने 'शुरू करने' और बस इंतज़ार करना चाहते हैं, तो आप कर चाहते हैं:

Wait.WaitOne(); 

आप बंद करो और यह बाहर निकलने देना चाहते हैं, तो आप तो कर सकते हैं:

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