using System; using System.Threading; using System.Threading.Tasks; namespace AsbCloudInfrastructure.Background { #nullable enable /// <summary> /// Класс разовой работы. /// Разовая работа приоритетнее периодической. /// </summary> public class WorkBase { /// <summary> /// Идентификатор работы. Должен быть уникальным. Используется в логах и передается в колбэки. /// </summary> public string Id { get; private set; } /// <summary> /// Делегат работы. /// <para> /// Параметры: /// <list type="number"> /// <item> /// <term>string</term> /// <description>Id Идентификатор работы</description> /// </item> /// <item> /// <term>IServiceProvider</term> /// <description>Поставщик сервисов</description> /// </item> /// <item> /// <term>CancellationToken</term> /// <description>Токен отмены задачи</description> /// </item> /// </list> /// </para> /// </summary> internal Func<string, IServiceProvider, CancellationToken, Task> ActionAsync { get; set; } /// <summary> /// Делегат обработки ошибки. /// Не должен выполняться долго. /// </summary> public Func<string, Exception, CancellationToken, Task>? OnErrorAsync { get; set; } /// <summary> /// максимально допустимое время выполнения работы /// </summary> public TimeSpan Timeout { get; set; } = TimeSpan.FromMinutes(1); /// <summary> /// Фактическое время успешного выполнения работы /// </summary> public TimeSpan? ExecutionTime { get; internal set; } /// <summary> /// Время последнего запуска /// </summary> public DateTime LastStart { get; set; } public WorkBase(string id, Func<string, IServiceProvider, CancellationToken, Task> actionAsync) { Id = id; ActionAsync = actionAsync; } } #nullable disable }