From 056b685eaa5ab7c1e8d5b269d63ae1cb2cdb31b6 Mon Sep 17 00:00:00 2001 From: ShiYu Date: Sat, 24 May 2025 10:29:22 +0800 Subject: [PATCH] fix(background): ensure partial results are saved on failure --- Services/Background/BackgroundTaskQueue.cs | 25 +++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/Services/Background/BackgroundTaskQueue.cs b/Services/Background/BackgroundTaskQueue.cs index bc7b566..f6fbb0b 100644 --- a/Services/Background/BackgroundTaskQueue.cs +++ b/Services/Background/BackgroundTaskQueue.cs @@ -198,6 +198,8 @@ public sealed class BackgroundTaskQueue : IBackgroundTaskQueue, IDisposable string localFilePath = ""; bool isTempFile = false; + var dbContext = await _contextFactory.CreateDbContextAsync(); + var picture = await dbContext.Pictures.FindAsync(task.PictureId); try { @@ -207,9 +209,7 @@ public sealed class BackgroundTaskQueue : IBackgroundTaskQueue, IDisposable // 1. 获取图片信息 await UpdatePictureStatus(task.PictureId, ProcessingStatus.Processing, 10); - var dbContext = await _contextFactory.CreateDbContextAsync(); - var picture = await dbContext.Pictures.FindAsync(task.PictureId); - + if (picture == null) { throw new Exception($"找不到ID为{task.PictureId}的图片"); @@ -276,6 +276,9 @@ public sealed class BackgroundTaskQueue : IBackgroundTaskQueue, IDisposable // 4. 从EXIF中提取拍摄时间并确保是UTC格式 picture.TakenAt = ImageHelper.ParseExifDateTime(exifInfo.DateTimeOriginal); + + // 保存缩略图和EXIF信息的更改,确保这些基本信息即使在后续步骤失败时也能保存 + await dbContext.SaveChangesAsync(); // 5. 将缩略图转换为Base64并调用AI分析 await UpdatePictureStatus(task.PictureId, ProcessingStatus.Processing, 50); @@ -360,6 +363,22 @@ public sealed class BackgroundTaskQueue : IBackgroundTaskQueue, IDisposable // 更新状态为失败 await UpdatePictureStatus(task.PictureId, ProcessingStatus.Failed, 0, ex.Message); + // 确保图片对象存在且已有的处理结果被保存 + if (picture != null) + { + picture.ProcessingStatus = ProcessingStatus.Failed; + picture.ProcessingError = ex.Message; + + try + { + await dbContext.SaveChangesAsync(); + } + catch (Exception saveEx) + { + Console.WriteLine($"保存失败状态时出错: {saveEx.Message}"); + } + } + // 记录错误日志 Console.WriteLine($"图片处理失败: 图片ID={task.PictureId}, 错误: {ex.Message}"); }