Я знаю, що це звучить по-дурному, але я намагався все, щоб зупинити таймер, але таймер не зупиниться. Я працюю над грою, і я був би вдячний, якби хтось сказав мені, як зупинити таймер.
Я знаю, що це звучить по-дурному, але я намагався все, щоб зупинити таймер, але таймер не зупиниться. Я працюю над грою, і я був би вдячний, якби хтось сказав мені, як зупинити таймер.
Відповіді:
Якщо ви використовуєте, System.Timers.Timer
ви можете зупинитись так
timer.Enabled = false
якщо ви використовуєте System.Threading.Timer
, використовуйте це
timer.Change(Timeout.Infinite , Timeout.Infinite)
Або використовувати
timer.Stop();
якщо ви використовуєте System.Windows.Forms.Timer
System.Windows.Forms.Timer: timer.Enabled = false;
System.Threading.Timer: timer.Change(Timeout.Infinite, Timeout.Infinite);
System.Timers.Timer: timer.Enabled = false;
абоtimer.Stop();
З кожним із таймерів у середовищі .NET можливо, що таймер спрацьовує безпосередньо перед тим, як зупинити його, тому ви побачите зворотний дзвінок після його зупинки.
Вам потрібно буде використовувати щось на зразок асинхронного контексту зворотного виклику : використовуйте bool
набір, true
коли ви хочете, щоб таймер працював, і встановлюйте його, false
коли ви зупиняєте його. Тоді нехай ваш зворотний дзвінок перевірить ваш контекст, чи дійсно він повинен працювати, чи ні.
Припускаючи, що ви використовуєте System.Windows.Forms.Timer; оскільки не було явного посилання ні на що інше ... якщо це так ...
System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.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
перевірки прапором ( ). Тому я запобігаю вашій проблемі, додавши додаткову перевірку прапора.
Для більшої ясності перегляньте код та додані коментарі. Сподіваюся, це допомагає.