Лучший способ проверить, когда наступит указанная дата
Вопрос
Существуют ли какие-либо классы в .NET framework, которые я могу использовать для запуска события, если время догнало указанный объект DateTime?
Если это не так, каковы наилучшие методы проверки этого?Создать новый поток, постоянно проверяющий?Таймер (не дай бог ;) )?
Решение
Я бы не стал использовать потоковый подход.Хотя спящий поток не потребляет процессорное время пользователя, он использует процессорное время ядра / системы.Во-вторых, в .NET вы не можете настроить размер стека потока.Таким образом, даже если все, что он делает, это переходит в спящий режим, вы застряли с попаданием в 2 МБ (я полагаю, что это размер стека по умолчанию для нового потока) ни за что.
Использование системы.Обработка потоков.Таймер.Он использует эффективную очередь по таймеру.У него могут быть сотни легковесных таймеров, которые выполняются только в 1 потоке, который повторно используется между всеми таймерами (при условии, что большинство таймеров не запускаются одновременно).
Другие советы
Когда поток находится в спящем режиме, он не использует процессор.Очень простым способом было бы создать поток, который будет находиться в спящем режиме до даты-времени.Например
DateTime future = DateTime.Now.Add(TimeSpan.FromSeconds(30));
new Thread(() =>
{
Thread.Sleep(future - DateTime.Now);
//RaiseEvent();
}).Start();
По сути, это говорит о том, что назначьте свидание в будущем (через тридцать секунд после настоящего момента).Затем создайте поток, который будет находиться в режиме ожидания в течение разницы во времени.Затем поднимите свое мероприятие.
Редактировать:Добавляю еще немного информации о таймерах.В таймерах нет ничего плохого, но я думаю, что это могло бы потребовать больше работы.У вас мог бы быть таймер с интервалом, равным разнице во времени.Это приведет к срабатыванию события tick, когда время достигнет значения объекта date time.Альтернатива, которую я бы не рекомендовал, и я, кажется, думаю, что у вас это есть, - включать таймер каждые пять секунд и проверять, совпадает ли время.Я бы избегал такого подхода и придерживался того, чтобы поток переходил в спящий режим до тех пор, пока не будет выполнена необходимая работа.
Таймер, вероятно, неплохой вариант.Просто используйте DateTime.Теперь, чтобы определить, превысило ли оно целевое время.Не используйте ==, если только вы не попытаетесь привести время к минуте, часу или чему-то еще.