Планировщик заданий Windows ИЛИ функции TaskService в WebApi

Я хочу создать некоторые функции в веб-API ASP.NET, которые должны выполняться ежедневно в определенное время и выполнять определенные задачи, такие как статусы обновления/записи/генерация электронных писем, SMS.

Должен ли я создать TaskService в коде

using System;
using Microsoft.Win32.TaskScheduler;

class Program
{
   static void Main(string[] args)
   {
      // Get the service on the local machine
      using (TaskService ts = new TaskService())
      {
         // Create a new task definition and assign properties
         TaskDefinition td = ts.NewTask();
         td.RegistrationInfo.Description = "Does something";

         // Create a trigger that will fire the task at this time every other day
         td.Triggers.Add(new DailyTrigger { DaysInterval = 2 });

         // Create an action that will launch Notepad whenever the trigger fires
         td.Actions.Add(new ExecAction("notepad.exe", "c:\\test.log", null));

         // Register the task in the root folder
         ts.RootFolder.RegisterTaskDefinition(@"Test", td);

         // Remove the task we just created
         ts.RootFolder.DeleteTask("Test");
      }
   }
}

или я должен создать файл .bat и создать новую задачу в планировщике заданий.


person Muhammad Saqlain    schedule 09.02.2017    source источник
comment
Я бы предложил службу Windows с запланированным таймером. Я использую эту реализацию в нескольких наших производственных задачах. Позвольте Windows обрабатывать отказоустойчивость, уведомления, ведение журнала, перезапуск и т. д. А с помощью шаблона очень легко создать службу Windows на C# в Visual Studio. codeproject.com/Articles/6507/NET-Scheduled-Timer   -  person Jon    schedule 17.02.2017


Ответы (4)


Как вы упомянули в вопросе, вам необходимо выполнять определенные задачи, такие как статусы обновления / записи / создание электронных писем, SMS и т. д.

Таким образом, доступ к базе данных входит в сценарий, а с другой стороны, вам придется отправлять электронные письма и SMS, которые могут потребовать доступа к сторонним библиотекам или другим настройкам конфигурации.

Таким образом, чтобы сделать все это, будет лучше использовать реализацию кода, с помощью которой вы сможете достаточно хорошо поддерживать свои изменения и требования.

Что касается «файла .bat и планировщика Windows», вам необходимо иметь отличные навыки использования ограниченного количества пакетных команд, доступных для выполнения ваших требований.

Итак, я предлагаю код, .exe и задачу планировщика Windows.

Кроме того, это должно быть отдельное приложение, не путайте его с кодом веб-API. Вы всегда можете создать новый проект в решении веб-API с проектом веб-API и повторно использовать любой возможный код.

person Jose Francis    schedule 15.02.2017

Вы должны сделать это вне вашего веб-кода. Это связано с тем, что ваше веб-приложение не должно иметь доступа к системе задач или веб-службе. По умолчанию IIS 7.5+ запускает приложения в своей собственной ограниченной учетной записи пользователя (https://www.iis.net/learn/manage/configuring-security/application-pool-identities).

person Andrew Monks    schedule 09.02.2017

Если вы хотите иметь надежное планирование задач, в котором вы можете применять временной интервал в зависимости от вашего выбора, я рекомендую [quartz]: https://www.quartz-scheduler.net/. Quartz позволяет легко добавлять/редактировать/удалять/и т. д. запланированную задачу, управляемую и не нагружающую ЦП. Более того, Quartz — это система планирования заданий с открытым исходным кодом, которую можно использовать как в самых маленьких приложениях, так и в крупных корпоративных системах.

person Rama Krishna    schedule 15.02.2017
comment
Вы когда-нибудь видели рабочий пример Quartz по состоянию на 2019 год? Если это так, пожалуйста, поделитесь. - person elemer82; 09.08.2019
comment
Ни один из примеров для Quartz, которые я пробовал, не работает. Также я хотел бы запланировать запуск функции (параметров) еженедельно, можете ли вы добиться этого в Quartz? - person elemer82; 09.08.2019

Я рекомендую вам попробовать Hangfire. Это бесплатно, и вы можете использовать его бесплатно в коммерческом приложении. Документацию вы можете найти здесь.

person kmatyaszek    schedule 09.02.2017
comment
Единственная проблема с этим заключается в том, что без конфигурации cleve / aadvanced, если пул приложений закрывается, задача не будет выполняться. Плюс может быть излишним только для 1 задачи. - person Andrew Monks; 09.02.2017
comment
@AndrewMonks, пожалуйста, прочитайте эту статью: docs.hangfire.io/en/latest/deployment-to-production/ - person kmatyaszek; 09.02.2017
comment
Его даже очень беспокоит, что их краткое руководство даже не рассматривает аутентификацию на приборной панели! - person Andrew Monks; 09.02.2017
comment
@AndrewMonks По умолчанию Hangfire разрешает доступ к страницам панели инструментов только для локальных запросов. Чтобы предоставить соответствующие права для использования в рабочей среде, см. раздел «Настройка авторизации» (docs.hangfire.io/en/latest/configuration/). - person kmatyaszek; 09.02.2017
comment
Я бы не рекомендовал запускать веб-приложение всегда. Я делал это раньше, но в современной среде у вас не всегда есть такой контроль (облако Azure, многопользовательский хост и т. д.). Было бы лучше отделить запланированные задачи от другой службы. - person Andrew Monks; 09.02.2017
comment
Я думал, что сервер API должен быть без гражданства. Причина того, что API-интерфейс фоновых процессов может задерживать ответ клиентам. - person Muhammad Saqlain; 10.02.2017
comment
Запускать некоторый код, когда часы тикают, в веб-службе в корне неправильно. Веб-служба обрабатывает запросы — вот в чем она хороша. Продолжай в том-же духе. Вся модель приложения ориентирована на это. Создайте отдельный проект для обработки тикающих часов. Вы можете использовать триггер таймера функций Azure очень просто сделать запрос к вашей веб-службе, чтобы сделать синхронизацию. - person Eric; 15.02.2017