C # - як зупинити таймер?


75

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


8
опублікуйте свій код для гарного початку.
Пабук

3
Який із класів таймера? Є 4, про які я знаю, лише в BCL.
Од

Зверху, принаймні, спробуйте сказати нам, що ви намагалися це зупинити. "Читати документацію" в іншому випадку є єдиною дійсною відповіддю.
TomTom

натисніть кнопку зверху! : P - покажіть будь-який код, будь ласка
Rippo

Відповіді:


167

Якщо ви використовуєте, System.Timers.Timerви можете зупинитись так

timer.Enabled = false

якщо ви використовуєте System.Threading.Timer, використовуйте це

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

Або використовувати

timer.Stop(); 

якщо ви використовуєте System.Windows.Forms.Timer


37

Отже, щоб додати до попередніх відповідей, якщо ви використовуєте клас System.Threading.Timer, це зупинить його назавжди без подальших шансів використовувати той самий екземпляр:

   timer.Dispose()

інакше:

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

24

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


8

З кожним із таймерів у середовищі .NET можливо, що таймер спрацьовує безпосередньо перед тим, як зупинити його, тому ви побачите зворотний дзвінок після його зупинки.

Вам потрібно буде використовувати щось на зразок асинхронного контексту зворотного виклику : використовуйте boolнабір, trueколи ви хочете, щоб таймер працював, і встановлюйте його, falseколи ви зупиняєте його. Тоді нехай ваш зворотний дзвінок перевірить ваш контекст, чи дійсно він повинен працювати, чи ні.


2
Я радий, що знайшов цю інформацію і тут. Я використовую замість додаткової змінної перевірку, чи таймер все ще ввімкнено при зворотному виклику таймера.
Fanda

1

Припускаючи, що ви використовуєте System.Windows.Forms.Timer; оскільки не було явного посилання ні на що інше ... якщо це так ...

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

1

Залежить від таймера. Якщо це з простору імен потоків, утилізуйте його та відтворіть за потреби, або попросіть делегата таймера зачекати на подію скидання (див. Msdn ). Простір імен System.Timers має метод запуску і зупинки.


1

Я теж неодноразово стикався з подібною проблемою.

//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перевірки прапором ( ). Тому я запобігаю вашій проблемі, додавши додаткову перевірку прапора.

Для більшої ясності перегляньте код та додані коментарі. Сподіваюся, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.