2012-09-21 54 views
115

संभव डुप्लिकेट:
How do you add a timer to a C# console application"टाइमर" को लागू करने का सबसे अच्छा तरीका क्या है?

एक टाइमर लागू करने के लिए सबसे अच्छा तरीका क्या है? एक कोड नमूना बहुत अच्छा होगा! इस प्रश्न के लिए, "सर्वश्रेष्ठ" को सबसे विश्वसनीय (कम से कम मिस्फीयर) और सटीक के रूप में परिभाषित किया जाता है। यदि मैं 15 सेकंड के अंतराल को निर्दिष्ट करता हूं, तो मैं चाहता हूं कि लक्ष्य विधि प्रत्येक 15 सेकंड में न हो, प्रत्येक 10-20 सेकंड में नहीं। दूसरी ओर, मुझे नैनोसेकंद सटीकता की आवश्यकता नहीं है। इस उदाहरण में, यह हर 14.51 - 15.4 9 सेकेंड को आग लगाने की विधि के लिए स्वीकार्य होगा।

+2

एक और बड़ा सवाल डुप्लिकेट बताते हैं कि यह अच्छी तरह से – pixel

उत्तर

206

Timer कक्षा का उपयोग करें।

https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

public static void Main() 
{ 
    System.Timers.Timer aTimer = new System.Timers.Timer(); 
    aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent); 
    aTimer.Interval=5000; 
    aTimer.Enabled=true; 

    Console.WriteLine("Press \'q\' to quit the sample."); 
    while(Console.Read()!='q'); 
} 

// Specify what you want to happen when the Elapsed event is raised. 
private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    Console.WriteLine("Hello World!"); 
} 

Elapsed घटना मिलीसेकंड के हर एक्स राशि, टाइमर वस्तु पर Interval संपत्ति द्वारा निर्दिष्ट बढ़ा दी जाएगी। यह उदाहरण में, Event Handler विधि आपके द्वारा निर्दिष्ट कॉल करेंगे ऊपर यह OnTimedEvent

+5

टाइमर एक अलग थ्रेड पर अमल करता है की ओर इशारा करते किसी भी उपयोगी लिंक के बिना डुप्लिकेट के रूप में चिह्नित किया जा रहा? –

+7

@ वॉननहिल्ट्स, संक्षिप्त उत्तर, हां। लंबा जवाब, समीक्षा [यह SO जवाब] (http: // stackoverflow।कॉम/ए/1436331/1630665) जो बताता है कि टाइमर कितना थ्रेड बहुत अच्छी तरह से फैलता है। –

+3

हो सकता है कि मेरे पास अधिक से अधिक निजीकरण वाले व्यक्ति इसे संपादित कर सकें: अंतराल संपत्ति मिलीसेकंड की संख्या निर्दिष्ट करती है, घटनाओं के बीच सेकंड नहीं। – Matthias

19

यह स्पष्ट आवेदन आप किस प्रकार विकसित करने के लिए जा रहे हैं नहीं है (डेस्कटॉप, वेब, कंसोल ...)

सामान्य उत्तर, यदि आप Windows.Forms एप्लिकेशन विकसित कर रहे हैं, तो

System.Windows.Forms.Timer कक्षा का उपयोग है। इसका लाभ यह है कि यह UI थ्रेड पर चलता है, इसलिए यह बस इसे परिभाषित करना आसान है, इसकी Tick ईवेंट की सदस्यता लें और हर 15 सेकंड पर अपना कोड चलाएं।

आप कुछ और करने हैं तो विंडोज़ रूपों (यह सवाल से स्पष्ट नहीं है), तो आप System.Timers.Timer चयन कर सकते हैं, लेकिन पर अन्य धागा इस एक रन, इसलिए यदि आप में से कुछ UI तत्व पर कार्रवाई करने के लिए जा रहे हैं इसकी Elapsed घटना, आपको इसे "invoking" पहुंच के साथ प्रबंधित करना होगा।

26

System.Windows.Forms.Timer कक्षा का उपयोग करके आप जो भी चाहते हैं उसे प्राप्त कर सकते हैं।

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer(); 


t.Interval = 15000; // specify interval time as you want 
t.Tick += new EventHandler(timer_Tick); 
t.Start(); 

void timer_Tick(object sender, EventArgs e) 
{ 
     //Call method 
} 

स्टॉप() विधि का उपयोग करके आप टाइमर को रोक सकते हैं।

t.Stop(); 
+1

यदि आपके पास कोई है, तो आप टूलबॉक्स से अपने फॉर्म पर टाइमर नियंत्रण खींच सकते हैं और यह आपके लिए उपरोक्त सभी करता है। –

+0

@RobSedgwick हां, मैं आपसे सहमत हूं। हम टूलबॉक्स के माध्यम से टाइमर नियंत्रण जोड़ सकते हैं। लेकिन जिस दृष्टिकोण को मैंने साझा किया वह रनटाइम एड टाइमर के माध्यम से है। –

2

संदर्भ ServiceBase को अपनी कक्षा में और OnStart स्थिति में नीचे दिए गए कोड डाल:

Constants.TimeIntervalValue = 1 (घंटे) .. आदर्श रूप में आप कॉन्फ़िग फ़ाइल में यह मान सेट करना चाहिए।

StartSendingMails = फ़ंक्शन नाम जिसे आप एप्लिकेशन में चलाने के लिए चाहते हैं।

protected override void OnStart(string[] args) 
     { 
      // It tells in what interval the service will run each time. 
      Int32 timeInterval = Int32.Parse(Constants.TimeIntervalValue) * 60 * 60 * 1000; 
      base.OnStart(args); 
      TimerCallback timerDelegate = new TimerCallback(StartSendingMails); 
      serviceTimer = new Timer(timerDelegate, null, 0, Convert.ToInt32(timeInterval)); 
     } 
+0

-1 ओपी एक कंसोल ऐप का उल्लेख करता है - इसमें विंडोज सर्विस क्लास को इसमें लाने का कोई कारण नहीं है। खासकर जब, समस्या को हल करने के लिए, आप एक ही टाइमर क्लास को स्वीकृत उत्तर के रूप में उपयोग कर रहे हैं। – TarkaDaal

+3

यह एक सेवा में दिखाया गया है लेकिन किसी भी कोड पर लागू है। @TarkaDaal का उल्लेख नहीं है। इस पोस्ट में कंसोल का उल्लेख नहीं है। केवल संभावित डुप्लिकेट में। –

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