using AsbCloudApp.Data;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace AsbCloudInfrastructure.Background
{
///
/// Класс разовой работы.
/// Разовая работа приоритетнее периодической.
///
public class Work : BackgroudWorkDto
{
private 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 Work(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();
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;
}
}
}