2010-04-29 14 views
7

मेरे पास एक कंसोल एप्लिकेशन है जो शुरू होता है, सेवाओं का एक समूह (लंबे समय से चलने वाला स्टार्टअप) होस्ट करता है, और उसके बाद ग्राहकों को इसमें कॉल करने की प्रतीक्षा करता है। मेरे पास एकीकरण परीक्षण है जो इस कंसोल एप्लिकेशन को शुरू करता है और "क्लाइंट" कॉल करता है। क्लाइंट कॉल करने से पहले मैं कंसोल एप्लिकेशन को स्टार्टअप को पूरा करने के लिए कैसे प्रतीक्षा करूं?कंसोल एप्लिकेशन निष्क्रिय होने तक मैं कैसे प्रतीक्षा करूं?

मैं Thread.Sleep(int) करने से बचना चाहता हूं क्योंकि यह स्टार्टअप समय (जो बदल सकता है) पर निर्भर है और स्टार्टअप तेज पर समय बर्बाद कर रहा है।

Process.WaitForInputIdle केवल यूआई के साथ अनुप्रयोगों पर काम करता है (और मैंने पुष्टि की है कि यह इस मामले में अपवाद फेंकता है)।

मैं जैसे अजीब समाधानों के लिए खुला हूं, कंसोल एप्लिकेशन तैयार होने पर एक temp फ़ाइल लिखता है।

+0

कंसोल एप्लिकेशन डब्ल्यूसीएफ सेवाओं को होस्ट करता है। "क्लाइंट" डब्ल्यूसीएफ कॉल करता है। यदि कंसोल एप्लिकेशन ने स्टार्टअप पूरा नहीं किया है, तो क्लाइंट एंडपॉइंट नहीं मिला अपवाद प्राप्त करता है। –

उत्तर

10

एक विकल्प एक नाम EventWaitHandle बनाना होगा। यह सिंक्रनाइज़ेशन ऑब्जेक्ट बनाता है जिसे आप संपूर्ण प्रक्रियाओं में उपयोग कर सकते हैं। फिर आपके पास 'क्लाइंट' एप्लिकेशन तब तक प्रतीक्षा करते हैं जब तक कि ईवेंट आगे बढ़ने से पहले संकेत नहीं दिया जाता है। एक बार मुख्य कंसोल एप्लिकेशन ने स्टार्टअप पूरा कर लिया है तो यह ईवेंट को सिग्नल कर सकता है।

http://msdn.microsoft.com/en-us/library/41acw8ct(VS.80).aspx

उदाहरण के लिए, अपने "सर्वर" सांत्वना आवेदन निम्नलिखित हो सकता है। यह संकलित नहीं है तो यह सिर्फ एक प्रारंभिक बिंदु :)

using System.Threading; 
static EventWaitHandle _startedEvent; 
static void main() 
{ 
    _startedEvent = new EventWaitHandle(false, EventResetMode.ManualReset, @"Global\ConServerStarted"); 

    DoLongRunnningInitialization(); 

    // Signal the event so that all the waiting clients can proceed 
    _startedEvent.Set(); 
} 

ग्राहकों तो यह

using System.Threading; 
static void main() 
{ 
    EventWaitHandle startedEvent = new EventWaitHandle(false, EventResetMode.ManualReset, @"Global\ConServerStarted"); 

    // Wait for the event to be signaled, if it is already signalled then this will fall throught immediately. 
    startedEvent.WaitOne();  

// ... continue communicating with the server console app now ... 
} 
+2

वह नाम "क्या" करता है? मैंने "MyCompany \ HostStarted" नाम का उपयोग किया और कंसोल एप्लिकेशन ने DirectoryNotFound अपवाद फेंक दिया! –

+3

मुझे वास्तव में इसका उल्लेख करना चाहिए था। ग्लोबल \ या स्थानीय \ उपसर्ग घटना के दायरे को नियंत्रित करता है। ग्लोबल \ सभी सत्रों में ईवेंट "विज़िबल" बनाता है, जबकि स्थानीय \ इसे वर्तमान सत्र में केवल दृश्यमान बना देगा। यह महत्वपूर्ण अंतर है जब ऐप टर्मिनल सर्वर सत्र पर चल रहा है उदाहरण के लिए, जहां आप स्थानीय आवश्यकताओं का उपयोग अपनी आवश्यकताओं के आधार पर कर सकते हैं। –

+1

यह भयानक और भयानक है। मुझे यह पसंद है। –

1

ऐप के क्लाइंट इंटरफ़ेस में एक तैयार चेक शामिल करें, या इसे तैयार होने से पहले इसे तैयार करने में कोई त्रुटि नहीं है।

+0

तो एप्लिकेशन को लूप में जांच करने की आवश्यकता होगी जब तक कि यह "मैं तैयार त्रुटि नहीं" वापस नहीं लौटाता? सुनिश्चित नहीं है कि यह एक अच्छा दृष्टिकोण है ... – Jack

0
  • के बाद से

    दो (कंसोल आवेदन, और एकीकरण परीक्षण ऐप है कि ग्राहक बनाता है कॉल - के रूप में मैं समझता हूँ) अलग आवेदन कर रहे हैं, तो एक तंत्र होना चाहिए - एक पुल - कि एक मध्यस्थ के रूप नाटक कहते थे (सॉकेट, बाहरी फ़ाइल, रजिस्ट्री, आदि)।

  • एक और संभावना यह हो सकती है कि आप एक औसत समय के साथ आते हैं जो कंसोल सेवाओं को लोड करने के लिए लेता है और उस समय आपके परीक्षण ऐप में उपयोग करता है; ठीक है, बस जोर से सोचो!

4

एक mutex सेट करने के बारे में क्या है, और इसे शुरू करने के बाद इसे हटा दिया जाता है। क्लाइंट ऐप तब तक प्रतीक्षा करें जब तक कि यह चीजें करने से पहले म्यूटेक्स को पकड़ न ले।

+0

मैंने जो जवाब दिया है उसके मूल में समान है, हालांकि इवेंटवाइटहैंडल का उपयोग करके कई क्लाइंट ऐप्स को मुख्य ऐप पर सिंक करने की अनुमति मिल जाएगी। –

1

की तरह कुछ कर रहे होते एक WCF सेवा है कि आप की स्थिति क्वेरी करने के लिए उपयोग कर सकते हैं बनाने के लिए है सर्वर प्रक्रिया। कमांड लाइन पर कोई विशेष आदेश पास होने पर ही इस सेवा को प्रारंभ करें।

  • होस्ट क्लाइंट अनुप्रयोग
  • net.tcp या नेट का उपयोग पहला ऑपरेशन के रूप में इस सेवा: निम्न लक्षण इस सेवा का एक बहुत तेजी से स्टार्टअप सुनिश्चित करेगा।पाइप बाध्यकारी क्योंकि वे शुरू बहुत जल्दी
  • यथासंभव सरल इस सेवा रखें सुनिश्चित करने के लिए जब तक सांत्वना आवेदन समाप्त नहीं करता है कि, यह उपलब्ध

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

+0

रास्ता बहुत अधिक काम है, हम इस चीज़ को उत्पादन में सेवा के रूप में होस्ट करते हैं और इस तरह की रेसिंग समस्या कभी नहीं होती है। –

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