Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
FaceHoof
88 / 81 / 59
Регистрация: 21.04.2014
Сообщений: 1,128
Завершенные тесты: 3
1

Выполнение метода в определённое время

04.07.2018, 13:59. Просмотров 602. Ответов 8
Метки нет (Все метки)

Здравствуйте.
Мне необходимо, чтобы некий метод выполнился в определённое время, на пример в 14:16. У меня на этот счёт было несколько идей:
1. Т.к. всё дело происходит в отдельном потоке, то можно просто рассчитать сколько осталось до нужного нам времени и поставить нужную задержку. Не катит, т.к. будут проблемы если изменить системное время.
2. Создать таймер, который будет раз в 30 секунд проверять не наступило ли нужное время.
3. Создать таймер у которого будет меняться интервал в зависимости от того во сколько выполняется код.

Но что-то мне ни одна из этих идей не нравится. всё кажется каким-то костыльным. Есть ещё способы?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2018, 13:59
Ответы с готовыми решениями:

Выполнение метода через заданное время
Добрый день! Интересует вопрос: как сделать периодическое выполнение некоторого метода ? Т.е. при...

Открытие файла на определённое время
Здравствуйте, хотел спросить какой код нужно добавить чтобы после открытия файла in.exe using...

Запрос на определённую страницу в определённое время
Как реализовать на C# посылку запроса на определённый URI в заданное время? К примеру в 00:00:01...

Изменение значения переменной через определённое время
Доброго времени суток, форумчане! Есть bool isBusy = true, как сделать так, чтобы по истечению...

8
Rius
Эксперт .NET
6439 / 4197 / 1004
Регистрация: 25.05.2015
Сообщений: 12,685
Записей в блоге: 12
Завершенные тесты: 4
04.07.2018, 14:04 2
Добавить программно в планировщик задач вызов своей программы с указанием аргументов, определяющих вызов нужного метода.
0
FaceHoof
88 / 81 / 59
Регистрация: 21.04.2014
Сообщений: 1,128
Завершенные тесты: 3
04.07.2018, 14:08  [ТС] 3
Rius, не подходит. У меня служба, которая по идеи должна работать круглосуточно. И раз в сутки делать определённое действие. Пусть это будет создание некого отчёта на основе данных, которые собрала/создала служба за сутки. И разделять это на две программы очень сильно не хочется.
0
netBool
317 / 298 / 171
Регистрация: 16.11.2010
Сообщений: 1,067
Записей в блоге: 9
Завершенные тесты: 5
04.07.2018, 14:19 4
Цитата Сообщение от FaceHoof Посмотреть сообщение
2. Создать таймер, который будет раз в 30 секунд проверять не наступило ли нужное время.
Цитата Сообщение от FaceHoof Посмотреть сообщение
У меня служба, которая по идеи должна работать круглосуточно. И раз в сутки делать определённое действие.
Почему тогда не поставить таймер на сутки, чтобы выполнять это действие?
0
FaceHoof
88 / 81 / 59
Регистрация: 21.04.2014
Сообщений: 1,128
Завершенные тесты: 3
04.07.2018, 14:22  [ТС] 5
Цитата Сообщение от netBool Посмотреть сообщение
Почему тогда не поставить таймер на сутки, чтобы на событие Tick, выполнять это действие?
Так ведь если службу запустят в 10:00, на пример, то "тик" будет тоже через сутки, а не в 14:16. Получается службу для корректной работы надо будет запустить строго в 14:16? Ну и опять же смена системного времени может произойти.
0
netBool
317 / 298 / 171
Регистрация: 16.11.2010
Сообщений: 1,067
Записей в блоге: 9
Завершенные тесты: 5
04.07.2018, 14:41 6
Цитата Сообщение от FaceHoof Посмотреть сообщение
Получается службу для корректной работы надо будет запустить строго в 14:16?
Ну не то, чтобы прям неразрешимая задача

Записать в настройках время тика - 14:16

Во время запуска службы вычесть из "тика" текущее время = 14:36-10:00=4:36. Поставить интервал на 4:36 и какой-нибудь bool-флаг о том, что это первый запуск. При достижении 14:36 выполнится "тик". Внутри него если флаг=труе, установить интервал 24 часа и флаг=фальш. Простая логическая схема
0
FaceHoof
88 / 81 / 59
Регистрация: 21.04.2014
Сообщений: 1,128
Завершенные тесты: 3
04.07.2018, 14:48  [ТС] 7
Цитата Сообщение от netBool Посмотреть сообщение
Во время запуска службы вычесть из "тика" текущее время = 14:36-10:00=4:36. Поставить интервал на 4:36 и какой-нибудь bool-флаг о том, что это первый запуск. При достижении 14:36 выполнится "тик". Внутри него если флаг=труе, установить интервал 24 часа и флаг=фальш.
Ну вот чего-то такого и хотелось избежать, кажется ужасно громоздким.

Нагуглил в итоге вот это:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DateTime when = new DateTime ( 2018, 7, 4, 14, 16, 00 );
 
            DateTime now = DateTime.Now;
            if ( when <= now )
            {
                CreateD ( );
            }
            else
            {
                System.Threading.Timer timer = null;
                timer = new System.Threading.Timer (
                    o => { CreateD ( ); timer.Dispose ( ); },
                    null,
                    when - now,
                    TimeSpan.Zero );
            }
Вроде работает как надо. Но если тут есть какие-то подводные камни, то прошу сообщить.
0
Wolfdp
902 / 806 / 208
Регистрация: 15.06.2012
Сообщений: 3,187
Записей в блоге: 1
Завершенные тесты: 1
04.07.2018, 15:08 8
Цитата Сообщение от FaceHoof Посмотреть сообщение
хотелось избежать
Нагуглили в итоге ровно тоже самое.

Цитата Сообщение от FaceHoof Посмотреть сообщение
timer.Dispose ( );
таймер отработает ровно один раз. Если тупо уберете єту запись, то тик будет происходить каждые when - now.

Цитата Сообщение от FaceHoof Посмотреть сообщение
опять же смена системного времени может произойти.
Вообще никак не учитывается. Можно поставить тик на 1 час и просто просматривать нужен ли запуск.

Цитата Сообщение от FaceHoof Посмотреть сообщение
У меня служба
докинте WCF, можно будет пинать и вручную по url. Правда неудобно в том, что условный сервис установил, и он сам себе начальник, а таск менеджер нужно настраивать... Особенно весело, когда при переносе сервиса забывают про него.
1
netBool
317 / 298 / 171
Регистрация: 16.11.2010
Сообщений: 1,067
Записей в блоге: 9
Завершенные тесты: 5
04.07.2018, 16:22 9
Цитата Сообщение от FaceHoof Посмотреть сообщение
Ну вот чего-то такого и хотелось избежать, кажется ужасно громоздким.
7-8 строчек кода...
0
04.07.2018, 16:22
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2018, 16:22

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Начало работы в определённое время суток
У меня есть определённый процесс, который будет выполняться каждый день в 0:00. Как это реализовать?

Изменение картинки через определённое время
Доброго времени суток. Я программирую под windows phone но на форуме в этой ветке нет живых :),...

Как заморозить программу на определённое время
Воспроизвожу звук. Длина мелодии ~ 5 секунд. private void playSound_Miss() { ...

Как спрятать консольную программу в трее при запуске и открыть в определённое время ?
Есть ли такой код,который спрячет консольную программу в трее при запуске и откроет в определённое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.