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