Таймеры .NET: Какой самый лучший способ получать уведомления за X секунд? - PullRequest
5 голосов
/ 29 сентября 2008

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

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

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

Ответы [ 6 ]

10 голосов
/ 29 сентября 2008

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

public Timer(
    TimerCallback callback,
    Object state,
    TimeSpan dueTime,
    TimeSpan period
)
5 голосов
/ 29 сентября 2008

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

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

2 голосов
/ 29 сентября 2008

Отключи новый BackgroundWorker, спи, закрывай.

var worker = new BackgroundWorker();
worker.DoWork += delegate {
  Thread.Sleep(30000); 
  DoStuff();
} 
worker.RunWorkerAsync();
1 голос
/ 30 сентября 2008

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

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

0 голосов
/ 29 сентября 2008

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

0 голосов
/ 29 сентября 2008

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

timer.enabled = false;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...