开发者

C# - how do you stop a timer?

开发者 https://www.devze.com 2023-02-01 15:13 出处:网络
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 ti

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.


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(); 


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)


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();


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.


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(); 


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.


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消