C # - Wie stoppt man einen Timer?


76

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


8
Veröffentlichen Sie Ihren Code für einen guten Start.
Pabuc

3
Welche der Timer-Klassen? Es gibt 4, von denen ich weiß, nur in der BCL.
Oded

Versuchen Sie zumindest, uns zu sagen, was Sie versucht haben, um es zu stoppen. "Lesen Sie die Dokumentation" ist ansonsten die einzig gültige Antwort.
TomTom

Drücken Sie den Knopf oben! : P - zeigen Sie bitte etwas Code
Rippo

Antworten:


166

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

timer.Enabled = false

Wenn Sie verwenden System.Threading.Timer, verwenden Sie diese

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

Oder verwenden

timer.Stop(); 

wenn Sie verwenden System.Windows.Forms.Timer


37

Wenn Sie also die vorherigen Antworten hinzufügen und die System.Threading.Timer-Klasse verwenden, wird sie dauerhaft gestoppt, ohne dass die Möglichkeit besteht, dieselbe Instanz zu verwenden:

   timer.Dispose()

Andernfalls:

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

24

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


8

Bei jedem der Timer im .NET Framework wird der Timer möglicherweise kurz vor dem Beenden ausgelöst, sodass der Rückruf nach dem Beenden angezeigt wird.

Sie müssen so etwas wie einen asynchronen Rückrufkontext verwenden : Verwenden Sie eine boolEinstellung, truewenn der Timer ausgeführt werden soll, und eine Einstellung, falsewenn Sie ihn stoppen. Lassen Sie dann Ihren Rückruf Ihren Kontext überprüfen, um festzustellen, ob er wirklich ausgeführt werden sollte oder nicht.


2
Ich bin froh, dass ich diese Informationen auch hier gefunden habe. Ich verwende anstelle einer zusätzlichen Variablen die Überprüfung, ob der Timer im Timer-Rückruf noch aktiviert ist.
Fanda

1

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

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

1

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 Ihren Timer-Delegaten auf das Rücksetzereignis warten (siehe msdn ). Der System.Timers-Namespace verfügt über eine Start- und Stoppmethode.


1

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 so?

Nehmen wir an, der Code im try-Block benötigt mehr Zeit. Wenn Sie also timer ( _timer.Enabled = false or _timer.Stop()) deaktivieren , besteht eine hohe Wahrscheinlichkeit, dass der Code im try-Block noch ausgeführt wird. Nach Abschluss der Aufgabe wird sie daher wieder aktiviert, wenn keine flag ( _shouldEnableTimer) - Prüfung erfolgt. Daher verhindere ich Ihr Problem, indem ich eine zusätzliche Flag-Prüfung hinzufüge.

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.