C # में टाइमर कैसे रीसेट करें?


114

तीन हैं Timerवर्गों है कि मैं के बारे में पता कर रहा हूँ, System.Threading.Timer, System.Timers.Timer, और System.Windows.Forms.Timerएक है, लेकिन इनमें से कोई भी राशि.Reset() समारोह जो 0 करने के लिए वर्तमान बीता हुआ समय रीसेट हो जाएंगे।

क्या कोई बीसीएल वर्ग है जिसकी यह कार्यक्षमता है? क्या इसे करने का एक गैर-हैक तरीका है? (मुझे लगा कि शायद इस पर समय सीमा बदलने से इसे रीसेट किया जा सकता है) सोचा Timerथा कि जिस वर्ग की यह कार्यक्षमता थी, उसे फिर से लागू करना कितना कठिन होगा , या बीसीएल वर्गों में से एक के साथ मज़बूती से इसे कैसे किया जाए?


3
जेपी के समाधान का उपयोग करते हुए एक एक्सटेंशन विधि का उपयोग करें
बेंजीन

मैं भी रीसेट के लिए एक ही जरूरत है और एक ही कारण के लिए उल्लेख किया है, FileSystemWatcher का उपयोग करने के लिए अप्रिय और असुविधाजनक है
जॉन लेविन

यदि आप स्टॉपवॉच का उपयोग एक टाइमर के लिए करते हैं और एक्सटेंशन विधि उत्तर के साथ जाते हैं, तो सावधान रहें क्योंकि स्टॉपवॉच.स्टार्ट एक्सटेंशन विधि .NET 4.0 में आ रही है। msdn.microsoft.com/en-us/library/…
si618

जवाबों:


148

मैं हमेशा करता हॅू ...

myTimer.Stop();
myTimer.Start();

... क्या वह हैक है? :)

प्रति टिप्पणी, Threading.Timer पर, यह परिवर्तन विधि है ...

समयावधि प्रकार: System.Int32समय की मात्रा निर्दिष्ट करने से पहले विलंब करने के लिए निर्दिष्ट समय जब टाइमर का निर्माण किया गया था, मिलीसेकंड में। Timeout.Infiniteटाइमर को पुनरारंभ करने से रोकने के लिए निर्दिष्ट करें । शून्य (0) निर्दिष्ट करें टाइमर को तुरंत पुनः आरंभ करें।


दूसरा मुद्दा यह है कि केवल Forms.Timer के साथ शोक होता है, और मेरे ऐप में कोई GUI (Application.Start () बिना किसी पैरामीटर के) है, इसलिए मुझे लगता है कि Threading.Timer वर्ग अन्य कारणों से बेहतर है, लेकिन अच्छी बात है।
मैथ्यू शार्ले

3
@ मैथ्यू: विभिन्न टाइमर कक्षाओं की चर्चा के लिए msdn.microsoft.com/en-us/magazine/cc164015.aspx देखें और जब उनका उपयोग करना उचित हो। सामान्य तौर पर, हालांकि, Forms.Timerइसका उपयोग केवल GUI के साथ किया जाना चाहिए। हालाँकि, इसके अलावा Forms.Timerऔर Threading.Timerभी है Timers.Timer
ब्रायन

60

सिस्टम टाइमिंग को छोड़कर सभी टाइमर स्टार्ट () और स्टॉप () तरीकों के बराबर हैं।

तो एक विस्तार विधि जैसे ...

public static void Reset(this Timer timer)
{
  timer.Stop();
  timer.Start();
}

... इसके बारे में जाने का एक तरीका है।


1
मैं बीता हुआ समय नहीं देख रहा हूँ। इसके लिए मेरा सटीक उपयोग यह है कि मेरे पास एक निर्देशिका देखने वाला FileSystemWatcher है और परिवर्तन के समूहों (यानी, एक दूसरे के उदाहरण के लिए 5 के भीतर किए गए परिवर्तन) को पकड़ना चाहता है। सिद्धांत यह है कि पहला परिवर्तन एक टाइमर शुरू करता है जो प्रत्येक परिवर्तन के साथ रीसेट हो जाता है जब तक कि यह अंततः बंद हो जाता है और समूह को बंद कर देता है।
मैथ्यू शारले

हाँ, मैंने देखा कि जब मैंने आपके प्रश्न को दोबारा पढ़ा। मेरे उत्तर का संपादन किया।
दान

यह काम करता है और यह ध्यान रखना महत्वपूर्ण है कि यह काम नहीं करेगा यदि आप केवल कॉल करते हैं timer.Start()। मैंने इसका परीक्षण करने के लिए इस Linqpad क्वेरी को बनाया । timer.Stopइसे हटाने का प्रयास करें और आपको अंतर दिखाई देगा।
जारेड बीच

30

के लिए System.Timers.Timer, MSDN प्रलेखन के अनुसार, http://msdn.microsoft.com/en-us/library/system.timers.timer.enabled.aspx :

यदि टाइमर शुरू होने के बाद अंतराल सेट किया जाता है, तो गणना रीसेट हो जाती है। उदाहरण के लिए, यदि आप अंतराल को 5 सेकंड के लिए सेट करते हैं और फिर सक्षम संपत्ति को सही पर सेट करते हैं, तो गणना उस समय शुरू होती है जब सक्षम किया गया है। यदि आप गणना 3 सेकंड के अंतराल पर 10 सेकंड के लिए रीसेट करते हैं, तो सक्षम होने के बाद पहली बार 13 सेकंड के लिए Elapsed ईवेंट को उठाया गया है।

इसलिए,

    const double TIMEOUT = 5000; // milliseconds

    aTimer = new System.Timers.Timer(TIMEOUT);
    aTimer.Start();     // timer start running

    :
    :

    aTimer.Interval = TIMEOUT;  // restart the timer

1
यहां समस्या यह है कि आप हमेशा उस समय को नहीं जानते हैं जिसे आप रीसेट करना चाहते हैं यदि टाइमर पहले से चल रहा है या नहीं। तो, आपको aTimer.Interval = TIMEOUT और aTimer.Start () करना होगा। तो पूरे में, ऊपर एक रीसेट फ़ंक्शन कम लाइनों और चर का उपयोग करता है। महान इसके अलावा।
ई-मोटिव

1
@ RU-Bn ओपी स्पष्ट रूप से कहता है " a .Reset () फ़ंक्शन जो वर्तमान बीता समय को 0 पर रीसेट करेगा ।" - यह उल्लेख नहीं करता है कि यह एक खराब डिज़ाइन किए गए एप्लिकेशन पर उपयोग करने का इरादा है जहां आपको यह भी नहीं पता है कि टाइमर चल रहा है या नहीं। लेखक की टिप्पणी (4 साल से अधिक समय पहले) को भी देखें: " सिद्धांत यह है कि पहला परिवर्तन एक टाइमर शुरू करता है जो प्रत्येक परिवर्तन के साथ रीसेट हो जाता है जब तक कि यह अंततः बंद हो जाता है और समूह को बंद कर देता है। " वैसे भी नीचे वोट के लिए धन्यवाद।
mMontu

मैंने उस तरह की समस्या भी देखी। मैंने जो किया वह है: aTimer.Interval = aTimer.Interval। यह शुरू हो गया कि लूप चल रहा था। मुझे मारता है क्यों लेकिन यह काम करता है ...
हरमन वान डेर ब्लॉम

7

आप एक विस्तार विधि लिख सकते हैं जिसे रीसेट () कहा जाता है, जो

  • कॉल बंद () - प्रारंभ () टाइमर के लिए। टाइमर और प्रपत्र। टाइमर
  • कॉल थ्रेडिंग के लिए बदलें

5

मैंने टाइमर को एक नया मान दिया है:

mytimer.Change(10000, 0); // reset to 10 seconds

यह मेरे लिए ठीक काम करता है।

कोड के शीर्ष पर टाइमर को परिभाषित करें: System.Threading.Timer myTimer;

if (!active)
        {
            myTimer= new System.Threading.Timer(new TimerCallback(TimerProc));
        }
        myTimer.Change(10000, 0);
        active = true;

private void TimerProc(object state)
    {
        // The state object is the Timer object.
        System.Threading.Timer t = (System.Threading.Timer)state;
        t.Dispose();
        Console.WriteLine("The timer callback executes.");
        active = false;
        //action to do when timer is back to zero
    }

5

स्पष्टता के लिए चूंकि कुछ अन्य टिप्पणियां गलत हैं, जब System.Timersसेटिंग को सही पर उपयोग करने से बीता हुआ समय रीसेट हो जाएगा । मैंने नीचे के साथ व्यवहार का परीक्षण किया:

Timer countDown= new Timer(3000);

Main()
{
    TextBox.TextDidChange += TextBox_TextDidChange;
    countdown.Elapsed += CountDown_Elapsed;
}

void TextBox_TextDidChange(Object sender, EventArgs e)
{
    countdown.Enabled = true;
}

void CountDown_Elapsed(object sender, EventArgs e)
{
    System.Console.WriteLine("Elapsed");
}

मैं पाठ बॉक्स पर पाठ को बार-बार इनपुट करूंगा और अंतिम कीस्ट्रोके के बाद टाइमर केवल 3 सेकंड चलाएगा। यह डॉक्स में संकेत दिया गया है, जैसा कि आप देखेंगे: कॉलिंग Timers.Start()बस सेट को सत्य करने में सक्षम है।

और यह सुनिश्चित करने के लिए, जिसे मुझे शुरुआत से ही सीधे जाना चाहिए था, आप .NET संदर्भ स्रोत में देखेंगे कि यदि पहले से ही सक्षम टाइमर को सक्षम करने पर यह निजी UpdateTimer()विधि को कॉल करता है , जो आंतरिक रूप से कॉल करता है Change()


नहीं तुम गलत हो। निजी UpdateTtimerपद्धति को कहा जाता है, यदि केवल और यदि वर्तमान मूल्य Enabledनए के बराबर नहीं है value
निकोलो कारंडिनी

3

एक टाइमर के लिए (System.Windows.Forms.Timer)।

.Stop, फिर .Start तरीकों ने रीसेट के रूप में काम किया।


1

Windows.timer को रीसेट करने के लिए अन्य वैकल्पिक तरीका काउंटर का उपयोग कर रहा है, इस प्रकार है:

int tmrCtr = 0;
Timer mTimer;

private void ResetTimer()
{
  tmrCtr = 0;
}

private void mTimer_Tick()
{
  tmrCtr++;
  //perform task
}  

इसलिए यदि आप हर 1 सेकंड को दोहराने का इरादा रखते हैं, तो आप टाइमर अंतराल को 100ms पर सेट कर सकते हैं, और काउंटर को 10 चक्रों पर परीक्षण कर सकते हैं।

यह उपयुक्त है अगर टाइमर को कुछ प्रक्रियाओं की प्रतीक्षा करनी चाहिए जिन्हें अलग-अलग समय अवधि में समाप्त किया जा सकता है।


1

मैं यह करता हूँ

//Restart the timer
queueTimer.Enabled = true;

यह इसे सक्षम बनाता है। भले ही यह पहले से अक्षम था, फिर से सक्षम करने से उस बिंदु पर एकत्र किए गए बीता हुआ समय नहीं बदला है।
vapcguy

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.