DD.WellWorkover.Cloud/AsbCloudInfrastructure/Background/WorkBase.cs

88 lines
3.2 KiB
C#
Raw Normal View History

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
{
2023-10-08 19:45:21 +05:00
internal Func<string, IServiceProvider, Action<string, double?>, CancellationToken, Task> ActionAsync { get; }
/// <summary>
2023-10-08 19:45:21 +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);
/// <summary>
2023-10-08 19:45:21 +05:00
/// Базовая работа
/// </summary>
/// <param name="id"></param>
/// <param name="actionAsync">
/// Делегат работы.
/// <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&lt;string, double?&gt;</term>
/// <description>on progress callback. String - new state text. double? - optional progress 0-100%.</description>
/// </item>
/// <item>
/// <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)
{
Id = id;
ActionAsync = actionAsync;
}
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 19:45:21 +05:00
SetStatusStart();
try
{
2023-10-08 19:45:21 +05:00
var task = ActionAsync(Id, services, UpdateStatus, token);
await task.WaitAsync(Timeout, token);
2023-10-08 19:45:21 +05:00
SetStatusComplete(task.Status);
return true;
}
catch (Exception exception)
{
2023-10-08 19:45:21 +05:00
SetLastError(exception.Message);
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 19:45:21 +05:00
return false;
}
}
}