LASAPlatform/OpenAuth.WebApi/SystemTask/DelayedExecutionService.cs

64 lines
2.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Autofac;
using OpenAuth.App.ServiceApp.DroneDocking;
namespace OpenAuth.WebApi.SystemTask;
public class DelayedExecutionService : BackgroundService
{
private readonly ILogger<DelayedExecutionService> _logger;
private readonly ILifetimeScope _lifetimeScope;
public DelayedExecutionService(ILogger<DelayedExecutionService> logger, ILifetimeScope lifetimeScope)
{
_logger = logger;
//_droneDockApp = droneDockApp;
_lifetimeScope = lifetimeScope;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("定时任务已启动将每5秒执行一次");
while (!stoppingToken.IsCancellationRequested)
{
try
{
await PerformDelayedTask();
// 等待5秒
await Task.Delay(TimeSpan.FromMinutes(5), stoppingToken);
}
catch (OperationCanceledException)
{
_logger.LogInformation("无人机状态上报任务被取消");
break;
}
catch (Exception ex)
{
_logger.LogError(ex, "无人机状态上报任务发生错误");
// 即使出错也继续下一次执行
await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken);
}
}
}
private async Task PerformDelayedTask()
{
await using (var scope = _lifetimeScope.BeginLifetimeScope())
{
// 2. 从子作用域中解析 AppService 实例InstancePerLifetimeScope 服务)
var appService = scope.Resolve<DroneDockApp>();
try
{
// 3. 调用 app 服务类的方法
await appService.ReportDroneStatus();
_logger.LogInformation("ReportDroneStatus 方法执行成功");
}
catch (Exception ex)
{
_logger.LogError(ex, "ReportDroneStatus 方法执行失败");
}
} // 4. 子作用域释放AppService 及内部资源(如数据库连接)自动释放
await Task.CompletedTask;
}
}