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 }; // 发送更新事件并保存到文件