2012-12-27 19 views
5

मुझे पता है कि .NET में तीन टाइमर प्रकार हैं (Comparing the Timer Classes in the .NET Framework Class Library देखें)। मैंने थ्रेडेड टाइमर चुना है क्योंकि मुख्य थ्रेड व्यस्त होने पर अन्य प्रकार बहाव कर सकते हैं, और मुझे इसे विश्वसनीय होने की आवश्यकता है।बाहर निकले बिना किसी अन्य थ्रेड पर पृष्ठभूमि प्रक्रिया चलाने के लिए मैं अपना कंसोल एप्लिकेशन कैसे प्राप्त करूं?

तरीका यह टाइमर टाइमर के नियंत्रण में काम करता है एक और धागा पर डाल दिया जाता है तो वह हमेशा काम के साथ-साथ टिकटिक माता पिता धागे पर पूरा शुरू कर सकते हैं जब यह व्यस्त नहीं है।

कंसोल एप्लिकेशन में इस टाइमर के साथ समस्या यह है कि टाइमर दूसरे थ्रेड पर टिक रहा है, जबकि मुख्य धागा कुछ भी नहीं कर रहा है, इसलिए एप्लिकेशन बंद हो जाता है।

मैंने while true लूप जोड़ने की कोशिश की, लेकिन टाइमर बंद होने पर मुख्य धागा बहुत व्यस्त है।

+5

आप द्वारा घड़ी चक्र कि भस्म किया जा रहा है त्यागना कर सकते हैं '' जबकि Thread.Sleep (100) जोड़कर TRUE' पाश 'पाश अंदर। विंडोज़ सेवा बनाने की तरह, यह सब करने का शायद एक बेहतर तरीका है। –

उत्तर

4

मैं एक बैरियर का उपयोग करता हूं जो सभी थ्रेड किए जाने तक प्रतीक्षा करता है। चूंकि एक मुख्य और गिनती धागा है, मेरे पास 2 प्रतिभागी हैं। तो यह कुछ इस तरह दिखेगा:

Module Module1 
     Dim x As New Threading.Thread(AddressOf tick) 
     Dim y As New Threading.Barrier(2) 

     Sub Main() 
      x.IsBackground = True 
      x.Start() 
      y.SignalAndWait() 
     End Sub 

     Sub tick() 
      Threading.Thread.Sleep(10000) 
      y.SignalAndWait() 
     End Sub 
    End Module 
+2

यह वास्तव में कुछ भी करता है, या यह एक 'स्लीप()' इसमें कॉल के साथ सिर्फ एक अंतहीन लूप के बराबर के लिए समारोह की एक पूरी बहुत कुछ है? (Http://msdn.microsoft.com/en-us/library/system.threading.barrier.aspx) [के लिए Threading.Barrier प्रलेखन] कहा गया है कि बैरियर वर्ग * "सहयोगात्मक में एक एल्गोरिथ्म पर काम करने के लिए सक्षम बनाता है कई कार्य कई चरणों के माध्यम से समानांतर। "* मुझे यहां" सहकारी, "" समांतर, "या" एकाधिक चरण "कहीं भी नहीं दिखाई देता है। –

+0

मुझे वास्तव में लगता है कि यह बैरियर का बहुत ही सरल और अच्छी तरह से समझा उपयोग है। मुख्य धागा और अन्य थ्रेड सहकारी रूप से काम करते हैं। सिर्फ इसलिए कि यह आसान है इसका मतलब यह नहीं है कि यह सहकारी रूप से काम नहीं कर रहा है। एक और बात, है बैरियर कोड का एक ही राशि के रूप में अपने "स्लीप() एक पाश में" सुझाव, जबकि यह करने के लिए और अधिक जटिल स्थितियों (अधिक धागे या जब प्रत्येक एमएस मामलों आदि ..), बिना किसी अतिरिक्त संसाधन लागत के साथ बिल्कुल फिट बैठता है लेता है । इस प्रकार, "प्रतीक्षा" के बजाय कुछ "अवरुद्ध" का उपयोग करना मेरे लिए ऐसा करने का अधिक उचित तरीका था। – theGD