diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 904bac9..6e2d13d 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -40,6 +40,23 @@ pub fn run() { } _ => {} }) + .setup(|app| { + let app_handle = app.handle().clone(); + // 创建后台任务检查下载状态 + tauri::async_runtime::spawn(async move { + loop { + { + let download_manager = app_handle.state::(); + if download_manager.has_downloads() { + let _ = download_manager.get_downloads().await; + } + } + tokio::time::sleep(tokio::time::Duration::from_secs(2)).await; + } + }); + + Ok(()) + }) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src-tauri/src/utils/download_manager.rs b/src-tauri/src/utils/download_manager.rs index ac77bc6..b09f690 100644 --- a/src-tauri/src/utils/download_manager.rs +++ b/src-tauri/src/utils/download_manager.rs @@ -17,6 +17,7 @@ pub struct DownloadManager { aria2_port: Arc>, aria2_pid: Arc>>, installing: Arc, + last_get_downloads: Arc>>, } impl DownloadManager { @@ -28,11 +29,40 @@ impl DownloadManager { aria2_port: Arc::new(Mutex::new(5144)), aria2_pid: Arc::new(Mutex::new(None)), installing: Arc::new(AtomicBool::new(false)), // 初始化为 false + last_get_downloads: Arc::new(Mutex::new(None)), } } - // 获取所有下载任务 pub async fn get_downloads(&self) -> Result, String> { + // 检查是否需要更新最后调用时间,并在作用域内立即释放锁 + let should_skip_update = { + if let Ok(last_call) = self.last_get_downloads.lock() { + if let Some(last_time) = *last_call { + last_time.elapsed().as_secs_f32() < 1.0 + } else { + false + } + } else { + false + } + }; + + if should_skip_update { + return self.get_downloads_internal().await; + } + + // 更新最后调用时间,并在作用域内立即释放锁 + { + if let Ok(mut last_call) = self.last_get_downloads.lock() { + *last_call = Some(std::time::Instant::now()); + } + } + + self.get_downloads_internal().await + } + + // 获取所有下载任务 + async fn get_downloads_internal(&self) -> Result, String> { // 获取队列中的任务信息并立即克隆所需数据,然后释放锁 let tasks_clone: Vec; let aria2_started; @@ -502,4 +532,13 @@ impl DownloadManager { Err(error_msg) } } + + // 检查是否有下载任务 + pub fn has_downloads(&self) -> bool { + if let Ok(downloads) = self.download_queue.lock() { + !downloads.is_empty() + } else { + false + } + } } \ No newline at end of file