2012-11-16 52 views
12

पर टिक नहीं करेगा मेरे पास मेरे कोड में Windows.Forms.Timer है, कि मैं 3 बार निष्पादित कर रहा हूं। हालांकि, टाइमर टिक फ़ंक्शन को बिल्कुल कॉल नहीं कर रहा है।टाइमर

private int count = 3; 
private timer; 
void Loopy(int times) 
{ 
    count = times; 
    timer = new Timer(); 
    timer.Interval = 1000; 
    timer.Tick += new EventHandler(timer_Tick); 
    timer.Start(); 
} 

void timer_Tick(object sender, EventArgs e) 
{ 
    count--; 
    if (count == 0) timer.Stop(); 
    else 
    { 
     // Do something here 
    } 
} 

Loopy() कोड में अन्य स्थानों से कॉल किया जा रहा है।

+1

पहले उत्तर सही :) –

+1

जहां दीवाना बुला रहे हैं से है? कोड में किसी अन्य स्थान से – Adil

+0

लूपी() को बुलाया जा रहा है। – cpdt

उत्तर

35

का उपयोग करके देखें System.Timers

void Loopy(int times) 
{ 
    count = times; 
    timer = new Timer(1000); 
    timer.Enabled = true; 
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
    timer.Start(); 
} 

void timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    throw new NotImplementedException(); 
} 
+0

+1 अभी तक केवल उपयोगी उत्तर के लिए। – avishayp

+0

बहुत बढ़िया! यह काम करता हैं! यकीन नहीं है कि क्यों ... – cpdt

+2

यह वास्तव में अस्पष्ट है कि यह समस्या को कैसे ठीक कर सकता है। वास्तव में वही रहता है (लेकिन फिर मैं मूल समस्या को फिर से उत्पन्न नहीं कर सकता)। – jeroenh

2

मुझे यकीन नहीं है कि आप क्या गलत कर रहे हैं यह सही दिखता है, यह कोड काम करता है: देखें कि यह आपके साथ कैसे तुलना करता है। बजाय Windows.Forms.Timer

public partial class Form1 : Form 
{ 
    private int count = 3; 
    private Timer timer; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Loopy(count); 
    } 

    void Loopy(int times) 
    { 
     count = times; 
     timer = new Timer(); 
     timer.Interval = 1000; 
     timer.Tick += new EventHandler(timer_Tick); 
     timer.Start(); 
    } 

    void timer_Tick(object sender, EventArgs e) 
    { 
     count--; 
     if (count == 0) timer.Stop(); 
     else 
     { 
      // 
     } 
    } 

} 
2

यहाँ एक Rx टिकर कि काम करता है:

Observable.Interval(TimeSpan.FromSeconds(1)) 
.Take(3) 
.Subscribe(x=>Console.WriteLine("tick")); 
बेशक

, आप में और अधिक उपयोगी कुछ सदस्यता ले सकते हैं आपका कार्यक्रम

+1

वास्तव में यह सबसे अच्छा जवाब है। जब भी मैं ईवेंट हैंडलर को स्पष्ट रूप से जोड़ने या हटाने को देखता हूं, तो मैं प्री-बेक्ड आरएक्स समाधान की तलाश करता हूं या ईवेंट हैंडलिंग को लपेटने के लिए एक एक्सटेंशन विधि लिखता हूं। ध्यान दें कि ले लो (3) न केवल तीन नमूने करता है बल्कि यह ईवेंट हैंडलर का भी निपटान करता है ताकि आप स्मृति को रिसाव न करें। सभी उपरोक्त समाधान ईवेंट प्राप्त करने के बाद ईवेंट हैंडलर को हटाना भूल जाते हैं। – bradgonesurfing

3

यदि विधि Loopy() को थ्रेड में कहा जाता है जो मुख्य UI थ्रेड नहीं है, तो टाइमर टिक नहीं पाएगा। यदि आप इस विधि को कोड में कहीं से भी कॉल करना चाहते हैं तो आपको InvokeRequired संपत्ति की जांच करनी होगी। तो अपने कोड की तरह (यह मानते हुए कि कोड ऐसे रूप में है) दिखना चाहिए:

 private void Loopy(int times) 
     { 
      if (this.InvokeRequired) 
      { 
       this.Invoke((MethodInvoker)delegate 
       { 
        Loopy(times); 
       }); 
      } 
      else 
      { 
       count = times; 
       timer = new Timer(); 
       timer.Interval = 1000; 
       timer.Tick += new EventHandler(timer_Tick); 
       timer.Start(); 
      } 
     }