C# - как остановить таймер?


Я знаю, что это звучит глупо, но я пробовала все, чтобы остановить таймер, но таймер не останавливается. Я работаю над игрой, и я был бы признателен, если бы кто-нибудь мог сказать мне, как остановить таймер.

7 54

7 ответов:

если вы используете System.Timers.Timer вы можете остановиться вот так

timer.Enabled = false

если вы используете System.Threading.Timer используйте этот

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

или использовать

timer.Stop(); 

если вы используете System.Windows.Forms.Timer

так, чтобы добавить к предыдущим ответам, в случае, если вы используете систему.Нарезка резьбы.класс Timer, это остановит его навсегда без дальнейшего шанса использовать тот же экземпляр:

   timer.Dispose()

в противном случае:

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

С каждого из таймеров .Чистая рамок, вполне возможно, что пожары таймер как раз перед тем, как остановить его, так что вы увидите обратный вызов после того, как вы его остановить.

вам нужно будет использовать что-то вроде асинхронный контекст обратного вызова используйте bool значение true когда вы хотите, чтобы таймер работал, и установите его в false когда вы прекратите. Затем попросите свой обратный вызов проверить свой контекст, чтобы увидеть, действительно ли он должен работать или нет.

предполагая, что вы используете систему.Окна.Формы.Таймер; поскольку не было явной ссылки на что-либо еще...если это так...

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

зависит от таймера. Если это из пространства имен threading, утилизируйте его и воссоздайте его, когда вам нужно, или попросите делегата таймера дождаться события сброса (см. msdn). Система.Пространство имен таймеров имеет метод start и stop.

Я тоже столкнулся с подобной проблемой много раз.

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

зачем это делать?

предположим, что код внутри блока try занимает больше времени. Итак, к моменту отключения таймера (_timer.Enabled = false or _timer.Stop()), существует высокая вероятность того, что код внутри блока try все еще выполняется. Следовательно, после завершения задачи, когда дело доходит до конца, он снова включается, если нет флага (_shouldEnableTimer) проверить. Поэтому я предотвращаю вашу проблему, добавляя дополнительный флаг проверять.

для большей ясности, пожалуйста, пройдите через код и добавленные комментарии. Надеюсь, это поможет.