it-swarm.com.de

Wie stoppst du einen Timer?

Ich weiß, es hört sich dumm an, aber ich habe alles versucht, um einen Timer zu stoppen, aber der Timer stoppt nicht. Ich arbeite an einem Spiel und ich würde mich freuen, wenn mir jemand sagen könnte, wie man einen Timer stoppt.

58
di0xide007

Wenn Sie System.Timers.Timer verwenden, können Sie so aufhören

timer.Enabled = false

wenn Sie System.Threading.Timer verwenden, verwenden Sie dies

timer.Change(Timeout.Infinite , Timeout.Infinite)

Oder verwenden 

timer.Stop(); 

wenn Sie System.Windows.Forms.Timer verwenden

129
Arsen Mkrtchyan

Um die vorherigen Antworten hinzuzufügen, falls Sie die Klasse System.Threading.Timer verwenden, Dadurch wird sie dauerhaft angehalten, ohne dass dieselbe Instanz verwendet werden kann:

   timer.Dispose()

andernfalls:

  timer.Change(Timeout.Infinite, Timeout.Infinite)
25
dexter

System.Windows.Forms.Timer: timer.Enabled = false;
System.Threading.Timer: timer.Change(Timeout.Infinite, Timeout.Infinite);
System.Timers.Timer: timer.Enabled = false; oder timer.Stop(); 

20
EricSchaefer

Bei jedem der Timer im .NET-Framework kann es sein, dass der Timer direkt vor dem Stopp ausgelöst wird. Nach dem Stopp wird der Callback angezeigt.

Sie müssen etwas wie einen asynchronen Callback-Kontext verwenden : Verwenden Sie eine bool-Einstellung, die auf true gesetzt ist, wenn Sie den Timer ausführen möchten, und setzen Sie ihn auf false, wenn Sie ihn stoppen. Lassen Sie Ihren Callback dann überprüfen, ob er wirklich ausgeführt werden soll oder nicht.

5
Stephen Cleary

Angenommen, Sie verwenden den System.Windows.Forms.Timer; da gab es keinen expliziten Hinweis auf irgendetwas anderes ... wenn das der Fall ist ...

System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Stop(); 
1
Aaron McIver

Kommt auf den Timer an. Wenn es sich um einen Threading-Namespace handelt, entsorgen Sie ihn und erstellen Sie ihn bei Bedarf neu, oder lassen Sie den Timer-Delegaten auf das Reset-Ereignis warten (siehe msdn ). Der Namespace von System.Timers verfügt über eine Start- und Stop-Methode.

1
Kell

Ich bin auch oft auf ein ähnliches Problem gestoßen.

//Timer init.
 var _timer = new System.Timers.Timer
{
    AutoReset = true, 
    Enabled = true,
    Interval = TimeSpan.FromSeconds(15).TotalMilliseconds //15 seconds interval
};
 _timer.Elapsed += DoSomethingOnTimerElapsed;


//To be called on timer elapsed.
private void DoSomethingOnTimerElapsed(object source, ElapsedEventArgs e)
{
    //Disable timer.
    _timer.Enabled = false; //or _timer.Stop()
    try
    {
        //does long running process
    }
    catch (Exception ex)
    {

    }
    finally
    {
        if (_shouldEnableTimer) //set its default value to true.
            _timer.Enabled = true; //or _timer.Start()
    }
}


//somewhere in the code if you want to stop timer:
_timer.Enabled = _shouldEnableTimer = false;

//At any point, if you want to resume timer add this:
_timer.Enabled = _shouldEnableTimer = true;

Warum das so machen?

Nehmen wir an, der Code im try-Block benötigt mehr Zeit. Wenn Sie den Zeitgeber (_timer.Enabled = false or _timer.Stop()) deaktivieren, ist die Möglichkeit groß, dass der Code im try-Block noch ausgeführt wird. Daher wird nach Abschluss der Task, wenn sie abgeschlossen ist, sie wieder aktiviert, wenn kein Flag (_shouldEnableTimer) geprüft wird. Daher vermeide ich Ihr Problem, indem Sie eine zusätzliche Flag-Prüfung hinzufügen.

Für mehr Klarheit gehen Sie bitte den Code und die hinzugefügten Kommentare durch. Hoffe das hilft.

1
Avi-B