С# Запланированная серия задач

Я собираюсь преобразовать приложение Classic ASP/VBScript в С#/ASP.Net. Часть VBScript приложения представляет собой серию отдельных скриптов, выполняемых каждый месяц в определенную дату с каждой отдельной задачей, настроенной в Планировщике Windows. Существует около 35 задач, которые включают в себя вставки базы данных (сохранение ежемесячных исторических данных, сохранение сводных данных фактуры), а также экспорт серии Crystal Reports в виде PDF файлов и Excel. Каждая задача запланирована примерно на одну минуту, так как я не хочу подавлять сервер базы данных одновременными запросами.

Как я подхожу к этому в С#, мне интересно, есть ли способ для этого в одном приложении, а не в отдельном подходе script, который я использовал с VBScript. Мне комфортно с С#, поскольку я использовал его для преобразования части веб-сайта приложения в ASP.Net MVC за последний год или около того, но у меня нет опыта работы с событиями времени в С#. Я думал о том, чтобы подойти к этому, создав отдельную функцию для каждой задачи, со сном между каждой задачей, чтобы позволить достаточно времени для обработки базы данных, прежде чем перейти к следующей задаче. Что-то вроде следующего:

p.DoTask1();
Thread.Sleep(60000);
p.DoTask2();
Thread.Sleep(60000);
p.DoTask3();
Thread.Sleep(60000);
etc ...

Это будет завершено в консольном приложении, которое будет настроено в Планировщике Windows.

Это хороший подход? Есть ли лучшие подходы? Я читал о таймерах и задачах, но я не уверен, соответствуют ли они тем, что я пытаюсь выполнить.

+5
источник поделиться
3 ответа

Вы можете запустить каждую задачу после того, как предыдущий закончил с помощью Task.ContinueWith. Подробнее см. этот ответ.

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

Преимущества, которые я вижу при использовании метода, подобного этому, просто спящего потоков, - это то, что у вас никогда не будет одновременно запущено несколько задач и не будет простоев между задачами.

Насколько важно то, что зависит от вашей ситуации, о которой вы более подробно понимаете.

+2
источник

Консольное приложение, запущенное Windows Scheduler, отлично подходит для меня. Я делаю это сам для программы интеграции базы данных, которую я делал, которая работает один раз в день. Для временных событий я использую класс System.Threading.Timer, например:

//here you set a time to start
var timeToStart = 60000;
//here an interval, if it not recurring use Timeout.Infinite
var tRefresh = Timeout.Infinite;
//here the method, I make it static
TimerCallback tcb1 = ClassName.MethodName;
var timer = new System.Threading.Timer(tcb1, null, timeToStart, tRefresh);

Вы можете создать несколько таймеров и назначить им разные задачи с разными временами запуска, чтобы решить вашу проблему.

+1
источник

Еще одно предложение для запуска этого для того, что стоит. Вы можете взглянуть на Quartz.Net вместо того, чтобы запускать консольное приложение под окнами, таким образом вы можете запускать задачи (или задания в квартете) через ваш сайт, а также развернуть и обновить весь свой код сразу, а не отдельное консольное приложение. Вы можете запланировать их с помощью настроек времени CRON - хотя сайт должен быть запущен, поэтому вам может понадобиться мониторинг или настройка ping, если они выполняются в нечетные моменты времени.

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос