Предположим, у меня есть одноразовое событие, которое нужно поднять через X секунд, например тайм-аут. Интуитивно было бы разумно создать System.Timers.Timer, установить для него интервал X * 1000, связать его галочку с событием и запустить его. Поскольку это единовременное событие, и вы хотите, чтобы оно возникло только один раз, вам придется останавливать таймер после того, как он сработает.
Однако тот факт, что таймеры по своей природе повторяются, заставляет меня сомневаться, действительно ли это лучший способ сделать это. Было бы лучше / точнее / безопаснее сохранить начатое время, установить таймер на тиканье каждую секунду (или даже миллисекунду) и по тиканью опрашивать систему на время и вручную вызывать целевое событие только по истечении необходимого времени?
Может ли кто-нибудь взвесить, какой из этих методов лучше (возможно, есть еще один вариант, о котором я тоже не думал). Становится ли один метод лучше другого, если время ожидания измеряется в миллисекундах?





просто используйте обычный таймер и отключите его по истечении одного раза. это должно решить вашу проблему.
оба, system.threading.timer и system.timers.timer поддерживают это.
Создайте новый BackgroundWorker, спите, закройте.
var worker = new BackgroundWorker();
worker.DoWork += delegate {
Thread.Sleep(30000);
DoStuff();
}
worker.RunWorkerAsync();
Это займет процессор на 30000 мс, не так ли?
@Nency - нет, я так не думаю, фоновый поток должен находиться в спящем режиме и поэтому не использовать процессорное время.
Точно - Async будет означать, что он будет спать в новом потоке, поэтому потребление ЦП не больше, чем таймер в своем собственном потоке.
просто установите галочку через X секунд, а в коде отметки выполните:
timer.enabled = false;
работал у меня.
Этот конструктор для System.Threading.Timer позволяет вам указать период. Если вы установите для этого параметра значение -1, он отключит периодическую сигнализацию и будет выполняться только один раз.
public Timer(
TimerCallback callback,
Object state,
TimeSpan dueTime,
TimeSpan period
)
!!! Святое дерьмо, Бен, никогда этого не знал, ты все запомнил MSDN или что-то в этом роде
Не знал и этого. Мне всегда казалось, что QTimer :: singleshot Qt проще, но приятно знать, что таймер BCL может это сделать :)
В качестве вопроса: простой вызов Timer (callback, state, dueTime, period) .Start () может привести к тому, что таймер будет GC'd, поэтому мне все равно нужно сохранить объект Timer?
@OregonGhost, по-видимому, вы имеете в виду "(новый таймер (...)). Start ()". Вы не должны этого делать; Таймер IDisposable.
Если вам нужен точный показатель времени, вам следует подумать об удвоении частоты таймера и использовании DateTime.Now для сравнения со временем начала. Таймеры и Thread.Sleep не обязательно являются точными в своих измерениях времени.
Вы можете использовать System.Timers.Timer с AutoReset = true или System.Threading.Timer с бесконечным периодом (System.Threading.Timeout.Infinite = -1) для однократного выполнения таймера.
В любом случае вы должны удалить свой таймер, когда закончите с ним (в обработчике событий для Timers.Timer или обратного вызова для Threading.Timer), если у вас нет повторяющегося интервала.
Я уже обдумывал этот вариант, но меня интересует надежность и тому подобное.