У меня вопрос о таймере. Выполняет ли время выполнения обратного вызова время интервала времени? Я имею в виду, например, у меня есть таймер, срабатывающий каждые 15 секунд, и он выполняет функцию обратного вызова, которая длится примерно 3 секунды. Когда в следующий раз будет срабатывать таймер? Через 18 секунд (после завершения обратного вызова) или через 15 секунд (без ожидания обратного вызова) ??? Заранее благодаренSystem.Threading.Timer ... Время следующего пожара?
ответ
Он будет срабатывать каждые 15 секунд независимо от времени выполнения обратного вызова. Если вы хотите включить время выполнения обратного вызова, вы можете приостановить и перезапустить таймер в обратном вызове следующим образом;
На старте:
someTimer.Change(Timeout.Infinite, Timeout.Infinite)
.. и в конце концов, изменить его обратно с тем же методом:
someTimer.Change(TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(15))
Вам не нужно менять таймер в начале, просто не указывайте период, чтобы таймер срабатывал только один раз. Таким образом, вызов «Change» на конце обратного вызова сбросит таймер –
Он будет срабатывать каждые 15 секунд. Любые задержки с помощью обратного вызова не влияют на таймер. Обратный вызов выполняется в отдельном потоке ThreadPool. От
Метод не выполняется в потоке, который создал таймер; он выполняется в потоке ThreadPool, поставляемом системой.
Если вы хотите, чтобы занять время обработки во внимание, вы должны управлять таймер самостоятельно - запустить таймер одного пожара и сбросить его изнутри обратного вызова, например:
TimerCallback tcb = MyCallBack;
//Start the timer once after 15 secs
_timer=new Timer(tcb,null,TimeSpan.FromSeconds(15),TimeSpan.Infinite);
...
void MyCallBack(Object stateInfo)
{
....
//Reset the timer
_timer.Change(TimeSpan.FromSeconds(15),TimeSpan.Infinite);
}
проще и чище использовать async/await
, чтобы ждать X секунд после каждого асинхронного выполнения. Например, следующий код будет выполнен метод 15 секунд после последнего выполнения:
while(...)
{
await Task.Delay(TimeSpan.FromSeconds(15));
var response=await Task.Run(()=>someMethod());
...
}
или, если вы хотите выполнить код, который уже асинхронный
while(...)
{
await Task.Delay(TimeSpan.FromSeconds(15));
await myHttpClient.GetStringAsync(someURL);
}
Под капотом Task.Delay
создает однократного таймера и завершается, когда таймер заканчивается. Это почти то же самое, что вы сделали бы вручную.
- 1. system.threading.timer
- 2. System.Threading.Timer
- 3. System.Threading.Timer
- 4. Событие пожара во время перехода
- 5. System.Threading.Timer не срабатывает через некоторое время
- 6. system.threading.timer не работает
- 7. время следующего цикла
- 8. Время до следующего щелчка
- 9. Время «пожара» (не создается) обрабатывается в winapi
- 10. System.Threading.Timer реализация низкого уровня
- 11. System.Timers.Timer vs System.Threading.Timer
- 12. System.Threading.Timer не запускается?
- 13. Сброс System.Threading.Timer using .Change
- 14. C# System.Threading.Timer Рекурсивные обновления
- 15. System.Threading.Timer останавливает поток?
- 16. «атомарной» изменение System.Threading.Timer
- 17. Медленная инициализация нескольких system.threading.timer
- 18. Только события пожара в определенное время в C#
- 19. Datagridview с System.Threading.Timer
- 20. Каково время выполнения следующего кода?
- 21. Заменить Thread.Sleep с System.Threading.Timer?
- 22. System.Threading.Timer Проверьте, работает ли
- 23. минимальный интервал для System.Threading.Timer
- 24. System.Threading.Timer не всегда называется
- 25. Использовать System.Threading.Timer с CustomThreadPool?
- 26. System.Threading.Timer callback не попадает
- 27. System.Threading.Timer не стреляет
- 28. Как отключить System.Threading.Timer
- 29. Насколько масштабируемым является System.Threading.Timer?
- 30. Странное поведение System.Threading.Timer
Таймер не имеет никакого отношения к его обратному вызову. Он будет срабатывать через 15 секунд –
, поэтому обратный вызов будет выполнен в другом потоке? –
http://blog.stackoverflow.com/2011/12/dont-be-afraid-to-use-the-science/ –