Frage

Angenommen, ich eine einmalige Veranstaltung, die X Sekunden ab jetzt wie ein Timeout angehoben werden muss. Intuitiv würde es Sinn machen, eine System.Timers.Timer zu erstellen, setzen Sie das Intervall auf X * 1000, Draht seines auf das Ereignis kreuzen und es beginnen. Da dies ein nicht-wiederkehrendes Ereignis ist und Sie nur wollen, dass es angehoben einmal würden Sie dann den Timer zu stoppen, nachdem er tickt.

Die Tatsache, dass Zeiten von Natur aus jedoch wiederkehrend macht mich misstrauisch, wenn dies in der Tat ist der beste Weg, es zu tun. Wäre es besser / genauer / sicherer die Zeit zu sparen begann, stellen Sie den Timer jede Sekunde (oder sogar Millisekunden) zu kreuzen und auf tick Umfrage des Systems für die Zeit und manuell das Zielereignis erhöhen nur einmal die erforderliche Zeit abgelaufen ist?

Kann jemand in, auf das wiegen, wenn eine Methode am besten ist (vielleicht gibt es eine weitere Option, die ich nicht von allzu glaubte). Hat eine Methode wird besser als die andere, wenn die Zeitspanne, die ich brauche, um in Millisekunden gemessen zu warten?

War es hilfreich?

Lösung

Das Konstruktor für die System.Threading.Timer ermöglicht es Ihnen, Zeitraum angeben . Wenn Sie diesen Parameter auf -1 gesetzt ist, wird es periodische Signalisierung deaktivieren und nur einmal ausgeführt werden.

public Timer(
    TimerCallback callback,
    Object state,
    TimeSpan dueTime,
    TimeSpan period
)

Andere Tipps

nur einen normalen Timer verwenden und deaktivieren Sie es, nachdem es einmal abgelaufen ist. das sollte Ihr Problem lösen.

beide, System.Threading.Timer und System.Timers.Timer dies zu unterstützen.

Spin-off einen neuen Background, schläft, in der Nähe.

var worker = new BackgroundWorker();
worker.DoWork += delegate {
  Thread.Sleep(30000); 
  DoStuff();
} 
worker.RunWorkerAsync();

Sie können eine System.Timers.Timer mit Autoreset verwenden = true, oder eine System.Threading.Timer mit einer unendlichen Periode (System.Threading.Timeout.Infinite = -1) einmal einen Timer auszuführen.

In jedem Fall sollten Sie Ihren Timer Entsorgen Sie, wenn Sie mit ihm (in dem Event-Handler für ein Timers.Timer oder den Rückruf für einen Threading.Timer) beendet haben, wenn Sie nicht ein wiederkehrendes Intervall haben.

gerade eingestellt es nach X Sekunden ticken, und im Code der Zecke, tun:

timer.enabled = false;

für mich gearbeitet.

Wenn Sie eine genaue Zeit messen wollen, sollten Sie die Timer-Frequenzverdopplung und DateTime.Now Verwendung mit Ihrer Startzeit zu vergleichen. Zeitgeber und Thread.Sleep sind nicht unbedingt in ihren Zeitmessungen exakt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top