From 6be3289d9308721a046e161dd7c51d83e5f8c7f3 Mon Sep 17 00:00:00 2001 From: lanyeeee Date: Tue, 10 Mar 2026 07:47:51 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=BA=9BTO?= =?UTF-8?q?DO=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/downloader/download_chunk_task.rs | 5 ++++- src-tauri/src/downloader/download_manager.rs | 4 +++- src-tauri/src/downloader/download_task.rs | 4 ++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/downloader/download_chunk_task.rs b/src-tauri/src/downloader/download_chunk_task.rs index 753405b..f4f262d 100644 --- a/src-tauri/src/downloader/download_chunk_task.rs +++ b/src-tauri/src/downloader/download_chunk_task.rs @@ -67,7 +67,10 @@ impl DownloadChunkTask { } } }, - + // FIXME: 直接返回chunk_index存在进度误标风险 + // 上层会将这个分片标记为已下载,而分片其实是被打断的 + // 应该把返回值改成 enum DownloadChunkResult { Downloaded(idx), Interrupted } + // 然后由上层处理 _ = restart_receiver.changed() => break Ok(self.chunk_index), _ = delete_receiver.changed() => break Ok(self.chunk_index), diff --git a/src-tauri/src/downloader/download_manager.rs b/src-tauri/src/downloader/download_manager.rs index aee4fd9..645e381 100644 --- a/src-tauri/src/downloader/download_manager.rs +++ b/src-tauri/src/downloader/download_manager.rs @@ -158,7 +158,9 @@ impl DownloadManager { tracing::error!(err_title, message); continue; }; - + // TODO: 应该先发删除新号再删文件 + // 因为发信号失败会把任务重新塞回去 + // 目前先删文件会导致发信号失败时出现 任务还在但文件没了的情况 if let Err(err) = self.delete_progress_file(task_id) { let err_title = "删除下载任务失败"; let message = err.to_message(); diff --git a/src-tauri/src/downloader/download_task.rs b/src-tauri/src/downloader/download_task.rs index 3fb0372..3ca0793 100644 --- a/src-tauri/src/downloader/download_task.rs +++ b/src-tauri/src/downloader/download_task.rs @@ -438,6 +438,10 @@ impl DownloadTask { let updated_progress = { let mut progress = self.progress.write(); update_fn(&mut progress); + // TODO: 这里应该返回 progress.clone() + // 专门用一个 {} 框出来就是为了避免在emit和save期间仍持有写锁 + // 然而这里弄错了progress的类型 + // 错把progress当成了DownloadProgress,实则类型为RwLockWriteGuard progress }; // 发送更新事件并保存到文件