Страницы

Поиск по вопросам

вторник, 9 октября 2018 г.

Вызов метода в конкретное время по графику (by schedule)

Как вызывать метод в конкретное время каждый день или же одноразово?


Ответ

Проблема вызова метода по расписанию не решается в общем виде. Дело в том, что в нужное время ваша программа может вовсе не работать!
Поэтому, для начала, требуется придумать способ запуска программы по этому самому расписанию.
Тут возможны три варианта:
Планировщик Windows. Иногда кажется, что про него забыли - но он со временем становится только лучше. И если на том же XP администратор часто выключал планировщик - то в последних версиях винды он обычно все же оставлен включенным, потому что на него завязано много полезных программ и служб.
Подробнее про создание задачи в планировщике windows можно увидеть тут: Creating Scheduled Tasks SQL Server Agent. Если вы используете SQL Server (а его использует довольно много проектов) - то и его агент будет где-то рядом. Процедура создания задачи описана на MSDN (там используются хранимые процедуры - то есть вам понадобится подключение к БД и права администратора сервера).

В обоих случаях, вам будет нужен какой-то способ вызвать не программу целиком, а конкретный метод. Для этого можно:
Выбирать метод для вызова исходя из аргументов командной строки. Тут может помочь пакет CommandLineParser из nuget. Использовать powershell. Поскольку powershell основан на CLR, из него можно обращаться к любым методам на C#:
Add-Type -Path путь\к\сборке.dll [Ваш.Класс]::СтатическийМетод(Параметры)
SQL Server Agent может вызвать встроенный powershell-скрипт, а планировщику windows будет нужен отдельный файл, лежащий на диске.
Также, вероятно, вам придется обработать событие AppDomain.AssemblyResolve чтобы загрузить зависимые сборки.

Можно написать свою службу, которая будет запущена все время и выполнять задачи. В этом случае вам может пригодиться библиотека Quartz.NET. Или же можно "накатать" свой велосипед (там основа - просто Thread.Sleep или Task.Delay в бесконечном цикле).
В любом случае, основная проблема тут будет - хранение списка задач в каком-то постоянном хранилище (БД) или восстановление этого списка при запуске службы.
Способ с хранением в БД больше подойдет для задач, создаваемых пользователем, а способ с восстановлением при запуске - для задач, определяемых настройками приложения.

Комментариев нет:

Отправить комментарий