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.
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
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:
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.
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();
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.privatevoidDoSomethingOnTimerElapsed(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.
Antworten:
Wenn Sie verwenden
System.Timers.Timer
, können Sie so aufhörentimer.Enabled = false
Wenn Sie verwenden
System.Threading.Timer
, verwenden Sie dieseOder verwenden
wenn Sie verwenden
System.Windows.Forms.Timer
quelle
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:
Andernfalls:
quelle
System.Windows.Forms.Timer:
timer.Enabled = false;
System.Threading.Timer:
timer.Change(Timeout.Infinite, Timeout.Infinite);
System.Timers.Timer:
timer.Enabled = false;
odertimer.Stop();
quelle
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.quelle
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();
quelle
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.
quelle
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.
quelle