2012-11-16 8 views
12

Ich habe eine Windows.Forms.Timer in meinem Code, den ich 3 Mal ausführen werde. Der Timer ruft jedoch die Tick-Funktion überhaupt nicht auf.Timer wird nicht ankreuzen

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() wird von anderen Stellen im Code aufgerufen wird.

+1

Die erste Antwort ist wahr :) –

+1

Von wo Sie Loopy fordern? – Adil

+0

Loopy() wird von einer anderen Stelle im Code aufgerufen. – cpdt

Antwort

35

Versuchen Sie es mit System.Timers statt Windows.Forms.Timer

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 für die einzige nützliche Antwort bisher. – avishayp

+0

Super! Es klappt! Nicht sicher warum, aber ... – cpdt

+2

Es ist mir wirklich unklar, wie das das Problem beheben kann. Benimmt sich genau gleich (aber ich kann das ursprüngliche Problem auch nicht reproduzieren). – jeroenh

2

Ich bin mir nicht sicher, was Sie falsch machen, es sieht richtig aus, dieser Code funktioniert: Sehen Sie, wie es mit Ihrem vergleicht.

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

Hier ist ein Rx Ticker, die funktioniert:

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

Natürlich können Sie etwas nützlicher abonnieren dein Programm.

+1

Wirklich das ist die beste Antwort. Jedes Mal, wenn ich explizites Hinzufügen oder Entfernen von Event-Handlern sehe, suche ich nach einer vorgebackenen RX-Lösung oder schreibe eine Erweiterungsmethode, mit der die Ereignisbehandlung umgangen werden soll. Beachten Sie, dass Take (3) nicht nur die drei Beispiele enthält, sondern auch den Ereignishandler, so dass kein Speicher verloren geht. Alle oben genannten Lösungen vergessen, den Ereignishandler nach dem Abrufen der Ereignisse zu entfernen. – bradgonesurfing

3

Wenn die Methode Loopy() in einem Thread aufgerufen wird, der nicht der Hauptthread der Benutzeroberfläche ist, wird der Timer nicht aktiviert. Wenn Sie diese Methode von überall im Code aufrufen möchten, müssen Sie die Eigenschaft InvokeRequired überprüfen. So soll Ihr Code aussehen (unter der Annahme, dass der Code in einer Form):

 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(); 
      } 
     } 
Verwandte Themen