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.
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.
Antworten:
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
System.Windows.Forms.Timer: timer.Enabled = false;
System.Threading.Timer: timer.Change(Timeout.Infinite, Timeout.Infinite);
System.Timers.Timer: timer.Enabled = false;
odertimer.Stop();
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 bool
Einstellung, true
wenn der Timer ausgeführt werden soll, und eine Einstellung, false
wenn Sie ihn stoppen. Lassen Sie dann Ihren Rückruf Ihren Kontext überprüfen, um festzustellen, ob er wirklich ausgeführt werden sollte oder nicht.
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();
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.
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.