using MilliSim.Services.Infrastructure; namespace MilliSim.Services; /// /// 后台定时任务:垃圾资源清理。 /// 每 6 小时扫描 PendingUploads 表,清理 24 小时前上传但未被消费(未保存到实体)的孤立文件。 /// 应对浏览器关闭、刷新等极端情况下前端无法触发清理的场景。 /// public class UploadCleanupJob : IHostedService, IDisposable { private readonly IServiceProvider _serviceProvider; private Timer? _timer; // 检查间隔:6 小时 private static readonly TimeSpan CheckInterval = TimeSpan.FromHours(6); // 过期时间:24 小时未消费则清理 private const int ExpireHours = 24; public UploadCleanupJob(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public Task StartAsync(CancellationToken cancellationToken) { // 启动后 5 分钟执行第一次(避免启动时并发),之后每 6 小时一次 _timer = new Timer(DoWork, null, TimeSpan.FromMinutes(5), CheckInterval); return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { _timer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } public void Dispose() { _timer?.Dispose(); } private async void DoWork(object? state) { try { using var scope = _serviceProvider.CreateScope(); var uploadTracking = scope.ServiceProvider.GetRequiredService(); await uploadTracking.CleanupExpiredAsync(ExpireHours); } catch { // 后台任务异常不应影响应用运行 } } }