it-swarm.com.de

Timerintervall 1000! = 1 Sekunde?

Ich habe ein Label, das die Sekunden meines Timers anzeigen soll (oder in anderen Wörtern habe ich eine Variable, zu der in jedem Timer-Intervall 1 hinzugefügt wird). Das Intervall meines Timers ist auf 1000 eingestellt. Das Label sollte sich also jede Sekunde aktualisieren (und auch die Sekunden anzeigen). Aber das Label ist nach 1 Sekunde schon in den Hunderten. Was ist das richtige Intervall, um 1 Sekunde zu bekommen?

int _counter = 0;
Timer timer;

timer = new Timer();
timer.Interval = 1000;
timer.Tick += new EventHandler(TimerEventProcessor);
label1.Text = _counter.ToString();
timer.Start();

private void TimerEventProcessor(object sender, EventArgs e)
{
  label1.Text = _counter.ToString();
  _counter += 1;
}
10

Das richtige Intervall, um eine Sekunde zu erhalten, ist 1000. Die Interval-Eigenschaft ist die Zeit zwischen Ticks in Millisekunden:

MSDN: Timer.Interval-Eigenschaft

Es ist also nicht das von Ihnen festgelegte Intervall falsch. Überprüfen Sie den Rest Ihres Codes, um beispielsweise das Zeitintervall des Timers zu ändern oder das Tick-Ereignis mehrmals zu binden.

10
Guffa

Verwenden Sie anstelle des Tick-Ereignisses das Elapsed-Ereignis.

timer.Elapsed += new EventHandler(TimerEventProcessor);

und ändern Sie die Signatur der TimerEventProcessor-Methode.

private void TimerEventProcessor(object sender, ElapsedEventArgs e)
{
  label1.Text = _counter.ToString();
  _counter += 1;
}
5
daryal

Andere Orte, an denen Sie TimerEventProcessor oder Counter verwenden? 

Sie können sich jedoch nicht darauf verlassen, dass das Ereignis genau pro Sekunde ausgeliefert wird. Die Zeit kann variieren und das System kann nicht sicherstellen, dass die durchschnittliche Zeit korrekt ist. 

Anstelle von _Counter sollten Sie also Folgendes verwenden:

 // when starting the timer:
 DateTime _started = DateTime.UtcNow;

 // in TimerEventProcessor:
 seconds = (DateTime.UtcNow-started).TotalSeconds;
 Label.Text = seconds.ToString();

Hinweis: Dies löst nicht das Problem, dass der TimerEventProcessor häufig aufgerufen wird oder der _Counter häufig erhöht wird. es maskiert es nur, aber es ist auch der richtige Weg, es zu tun. 

1
peterchen