2010-08-02 6 views
9

मेरे पास एक कंसोल एप्लिकेशन है, और मैं इसे कुछ ईवेंट उठाए जाने तक प्रतीक्षा करना चाहता हूं। लेकिन यह कोड निष्पादित करता है और बाहर निकल जाता है:एक कंसोल एप्लिकेशन बनाना विंडोज अनुप्रयोग की तरह व्यवहार करता है

static void Main(string[] args) 
{ 
    var someObjectInstance = new SomeObject(); 
    someObjectInstance.SomeEvent += SomeEventHandler; 
} 

static void SomeEventHandler() 
{ 
    //Some logic 
} 

मैं अपने आवेदन एक विंडोज़ अनुप्रयोग जहां

Application.Run(new Form1()); 

कहा जाता है और संदेश पाश चलाया जाता है की तरह व्यवहार करना चाहते हैं।

लेकिन मुझे न तो एक संदेश लूप और न ही किसी भी रूप की आवश्यकता नहीं है। तो यह ओवरहेड की तरह दिखता है। क्या मेरे लक्ष्य को हासिल करने के लिए एक और हल्का वजन तरीका है?

+2

क्या * पहलू एक Windows के व्यवहार के * फॉर्म्स एप्लिकेशन तुम सच के लिए देख रहे हैं? उस घटना को बढ़ाने के लिए क्या चल रहा है? –

+0

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

उत्तर

18

सबसे पहले, जब तक SomeObject एक अलग थ्रेड पर घटना को बढ़ाने के लिए जा रहा है, इस SomeObject में प्रसंस्करण के कुछ फार्म के बिना काम नहीं करेगा। अगर यह इस तरह से डिजाइन किया गया है, हालांकि, यह काफी सरल है।

से निपटने यह सिर्फ एक WaitHandle पर प्रतीक्षा करने के लिए है का एक बहुत ही कारगर तरीका:

private static ManualResetEvent waitHandle = new ManualResetEvent(false); 
static void Main(string[] args) 
{ 
    var someObjectInstance = new SomeObject(); 
    someObjectInstance.SomeEvent += SomeEventHandler; 
    waitHandle.WaitOne(); // Will block until event occurs 
} 

static void SomeEventHandler() 
{ 
    //some logic 
    waitHandle.Set(); // Will allow Main() to continue, exiting the program 
} 
+0

'मैनुअल रीसेट इवेंट' क्या नामस्थान है? – ArtOfCode

+0

@ArtOfCode सिस्टम। पढ़ना: https://msdn.microsoft.com/en-us/library/system.threading.manualresetevent%28v=vs.110%29.aspx हालांकि मैं आज 'मैनुअल रीसेट इवेंटस्लिम' की सिफारिश करता हूं ... –

+0

हे। डोंट वोर्री; तब से मुझे ऐसा करने का एक और तरीका मिला है इसलिए मैं वास्तव में इसका उपयोग नहीं करूँगा। – ArtOfCode

2

जोड़े

Console.ReadLine(); आप अपने eventhandler देते हैं के बाद।

उदाहरण के लिए ..

class Program 
{ 
    static void Main(string[] args) 
    { 
     System.IO.FileSystemWatcher watcher = new System.IO.FileSystemWatcher(@"c:\", "*.txt"); 
     watcher.Created += new System.IO.FileSystemEventHandler(watcher_Created); 
     watcher.EnableRaisingEvents = true; 
     Console.ReadLine(); 
    } 

    static void watcher_Created(object sender, System.IO.FileSystemEventArgs e) 
    { 
     Console.WriteLine(string.Format("{0} was created at {1:hh:mm:ss}", e.FullPath, DateTime.Now)); 
    } 
} 
+1

यह कंसोल एप्लिकेशन को हमेशा के लिए लटकाएगा, जब तक कोई कंसोल में टाइप न करे ... सुनिश्चित नहीं है कि यह उचित व्यवहार है, क्योंकि इसमें किसी (बाहरी) ईवेंट की प्रतीक्षा करने के लिए कुछ भी नहीं है। –

+0

परीक्षण के लिए बढ़िया ... उत्पादन कोड के लिए इतना अच्छा है। उत्पादन में –

+0

मैं इस विशिष्ट उदाहरण के लिए एक सेवा का उपयोग करूंगा। लेकिन यह ठीक काम करता है। –

-1

संपादित करें: दुर्भाग्य से, मैं गलत था और यह काम नहीं करेगा, क्योंकि Application एक सांत्वना आवेदन के लिए निर्धारित नहीं है (धन्यवाद, रीड Copsey)।

यह चाल चलाना चाहिए, हालांकि आपके द्वारा चुने गए सपने के आधार पर आप सीपीयू को हॉगिंग कर सकते हैं। मुझे ऐसा लगता है कि ऐसा करने का एक सुरक्षित तरीका होना चाहिए?

while (true) 
{ 
    Application.DoEvents(); 
    Thread.Sleep(this.SleepTime); 
} 

+1

यह केवल तभी काम करेगा जब आपके पास Windows फॉर्म संदेश पंप हो, जो कि कंसोल एप्लिकेशन में कभी नहीं होना चाहिए ... "एप्लिकेशन" केवल विंडोज फॉर्म एप्लिकेशन पर परिभाषित किया गया है। इसके अलावा, किसी भी मामले में, इस तरह सोना शायद सबसे अच्छा तरीका नहीं है। –

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