.NET-таймеры:Как лучше всего получить уведомление через X секунд?

StackOverflow https://stackoverflow.com/questions/148594

  •  02-07-2019
  •  | 
  •  

Вопрос

Предположим, у меня есть неповторяющееся событие, которое необходимо вызвать через X секунд, например тайм-аут.Интуитивно было бы разумно создать System.Timers.Timer, установить для него интервал X*1000, привязать его тик к событию и запустить его.Поскольку это неповторяющееся событие, и вы хотите, чтобы оно возникало только один раз, вам придется остановить таймер после того, как он отработает.

Однако тот факт, что таймеры по своей сути повторяются, заставляет меня сомневаться, действительно ли это лучший способ сделать это.Было бы лучше/точнее/безопаснее сохранить начатое время, установить таймер на отметку каждую секунду (или даже миллисекунду), а затем опрашивать систему на предмет времени и вручную вызывать целевое событие только по истечении необходимого времени?

Может ли кто-нибудь оценить, какой из методов лучше (возможно, есть еще один вариант, о котором я тоже не подумал).Станет ли один метод лучше другого, если время ожидания будет измеряться миллисекундами?

Это было полезно?

Решение

Этот конструктор для System.Threading.Timer позволяет указать период.Если вы установите для этого параметра значение -1, он отключит периодическую сигнализацию и будет выполняться только один раз.

public Timer(
    TimerCallback callback,
    Object state,
    TimeSpan dueTime,
    TimeSpan period
)

Другие советы

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

оба, system.threading.timer и system.timers.timer поддерживают это.

Выделите новый BackgroundWorker, спите, закройте.

var worker = new BackgroundWorker();
worker.DoWork += delegate {
  Thread.Sleep(30000); 
  DoStuff();
} 
worker.RunWorkerAsync();

Вы можете использовать System.Timers.Timer с AutoReset = true или System.Threading.Timer с бесконечным периодом (System.Threading.Timeout.Infinite = -1) для однократного выполнения таймера.

В любом случае вам следует удалить свой таймер после завершения работы (в обработчике событий для Timers.Timer или обратном вызове для Threading.Timer), если у вас нет повторяющегося интервала.

просто установите галочку через X секунд и в коде галочки выполните:

таймер.включено = ложь;

работал у меня.

Если вам нужно точное измерение времени, вам следует рассмотреть возможность удвоения частоты таймера и использования DateTime.Now для сравнения со временем начала.Таймеры и Thread.Sleep не обязательно точны в измерениях времени.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top