C# - how do you stop a timer?

C#.NetTimer

C# Problem Overview


I know it sounds stupid, but I've tried everything to stop a timer, but the timer won't stop. I'm working on a game and i would appreciate if someone could tell me how to stop a timer.

C# Solutions


Solution 1 - C#

If you are using System.Timers.Timer stopping is performed by one of the options:

//options 1
timer.Enabled = false
//option 2
timer.Stop()

if you are using System.Threading.Timer, use this method

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

if you are using System.Windows.Forms.Timer, use this method

timer.Stop(); 

Solution 2 - C#

So to add to the previous answers, in case you are using the System.Threading.Timer class, this will stop it permanently with no further chance to use the same instance:

   timer.Dispose()

otherwise:

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

Solution 3 - C#

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

Solution 4 - C#

With each of the timers in the .NET framework, it's possible that the timer fires just before you stop it, so you'll see the callback after you stop it.

You'll need to use something like an asynchronous callback context: use a bool set to true when you want the timer running, and set it to false when you stop it. Then have your callback check your context to see if it should really run or not.

Solution 5 - C#

Assuming you are making use of the System.Windows.Forms.Timer; since there was no explicit reference to anything else...if that is the case...

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

Solution 6 - C#

Depends on the timer. If it is from threading namespace, dispose of it and recreate it when you need to, or have your timer delegate wait on reset event(see msdn). System.Timers namespace has a start and stop method.

Solution 7 - C#

I also ran into the similar problem many times.

//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;

Why to do so?

Lets assume, the code inside the try block takes more time. So, by the time you disable timer (_timer.Enabled = false or _timer.Stop()), there is high possibilty that the code inside try block is still executing. Hence, after completion of the task when it comes to finally, it is again enabled if there is no flag(_shouldEnableTimer) check. Therefore, I prevent your problem by adding an additional flag check.

For more clarity, please go through the code and the added comments. Hope this helps.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questiondi0xide007View Question on Stackoverflow
Solution 1 - C#Arsen MkrtchyanView Answer on Stackoverflow
Solution 2 - C#dexterView Answer on Stackoverflow
Solution 3 - C#EricSchaeferView Answer on Stackoverflow
Solution 4 - C#Stephen ClearyView Answer on Stackoverflow
Solution 5 - C#Aaron McIverView Answer on Stackoverflow
Solution 6 - C#KellView Answer on Stackoverflow
Solution 7 - C#Avishekh BharatiView Answer on Stackoverflow