using System; using System.Threading; using System.Threading.Tasks; namespace AsbCloudInfrastructure.Background { /// /// Класс разовой работы. /// Разовая работа приоритетнее периодической. /// public class WorkBase : BackgroudWorkDto { internal Func, CancellationToken, Task> ActionAsync { get; } /// /// Делегат обработки ошибки. /// Не должен выполняться долго. /// public Func? OnErrorAsync { get; set; } public TimeSpan OnErrorHandlerTimeout { get; set; } = TimeSpan.FromSeconds(5); /// /// Базовая работа /// /// /// /// Делегат работы. /// /// Параметры: /// /// /// string /// Id Идентификатор работы /// /// /// IServiceProvider /// Поставщик сервисов /// /// /// Action<string, double?> /// on progress callback. String - new state text. double? - optional progress 0-100%. /// /// /// CancellationToken /// Токен отмены задачи /// /// /// /// public WorkBase(string id, Func, CancellationToken, Task> actionAsync) { Id = id; ActionAsync = actionAsync; } /// /// Запустить работу /// /// /// /// True - susess, False = Fail public async Task Start(IServiceProvider services, CancellationToken token) { SetStatusStart(); try { var task = ActionAsync(Id, services, UpdateStatus, token); await task.WaitAsync(Timeout, token); SetStatusComplete(task.Status); return true; } catch (Exception exception) { SetLastError(exception.Message); if (OnErrorAsync is not null) { var task = Task.Run( async () => await OnErrorAsync(Id, exception, token), token); await task.WaitAsync(OnErrorHandlerTimeout, token); } } return false; } } }