Лучший способ проверить, когда наступит указанная дата

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

  •  03-07-2019
  •  | 
  •  

Вопрос

Существуют ли какие-либо классы в .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.Теперь, чтобы определить, превысило ли оно целевое время.Не используйте ==, если только вы не попытаетесь привести время к минуте, часу или чему-то еще.

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