From 95c23730eff18a4335745fdbd88a7ef9446ccf86 Mon Sep 17 00:00:00 2001 From: wonfen Date: Fri, 16 May 2025 11:18:44 +0800 Subject: [PATCH] perf: async config handling with optimized port lookup and save logic --- UPDATELOG.md | 2 ++ src-tauri/src/utils/resolve.rs | 51 ++++++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index c90a8a4e..9d2ac50c 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -67,6 +67,8 @@ - 重构了原来的 IP 信息请求重试机制,采用轮询检测,解决了 Network Error 和超时问题 - 对轮询检测机制进行了优化,引入洗牌算法来增强随机性。 - 对获取系统信息的流程进行了优化,并添加了去重检测机制,确保剔除重复的信息 + - 优化窗口状态初始化逻辑和添加缺失的权限设置 + - 异步化配置:优化端口查找和配置保存逻辑 ## v2.2.3 diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 8b182657..08b3caa1 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -13,11 +13,11 @@ use parking_lot::{Mutex, RwLock}; use percent_encoding::percent_decode_str; use serde_yaml::Mapping; use std::{ - net::TcpListener, sync::Arc, time::{Duration, Instant}, }; use tauri::{AppHandle, Emitter, Manager}; +use tokio::net::TcpListener; use tauri::Url; //#[cfg(not(target_os = "linux"))] @@ -123,8 +123,8 @@ pub fn reset_ui_ready() { logging!(info, Type::Window, true, "UI就绪状态已重置"); } -pub fn find_unused_port() -> Result { - match TcpListener::bind("127.0.0.1:0") { +pub async fn find_unused_port() -> Result { + match TcpListener::bind("127.0.0.1:0").await { Ok(listener) => { let port = listener.local_addr()?.port(); Ok(port) @@ -156,7 +156,15 @@ pub async fn resolve_setup_async(app_handle: &AppHandle) { logging_error!(Type::Setup, true, init::startup_script().await); - logging_error!(Type::System, true, resolve_random_port_config()); + if let Err(err) = resolve_random_port_config().await { + logging!( + error, + Type::System, + true, + "Failed to resolve random port config: {}", + err + ); + } logging!(trace, Type::Config, true, "初始化配置..."); logging_error!(Type::Config, true, Config::init_config().await); @@ -444,7 +452,7 @@ pub async fn resolve_scheme(param: String) -> Result<()> { Ok(()) } -fn resolve_random_port_config() -> Result<()> { +async fn resolve_random_port_config() -> Result<()> { let verge_config = Config::verge(); let clash_config = Config::clash(); let enable_random_port = verge_config.latest().enable_random_port.unwrap_or(false); @@ -455,21 +463,34 @@ fn resolve_random_port_config() -> Result<()> { .unwrap_or(clash_config.data().get_mixed_port()); let port = if enable_random_port { - find_unused_port().unwrap_or(default_port) + find_unused_port().await.unwrap_or(default_port) } else { default_port }; - verge_config.data().patch_config(IVerge { - verge_mixed_port: Some(port), - ..IVerge::default() - }); - verge_config.data().save_file()?; + let port_to_save = port; + + tokio::task::spawn_blocking(move || { + let verge_config_accessor = Config::verge(); + let mut verge_data = verge_config_accessor.data(); + verge_data.patch_config(IVerge { + verge_mixed_port: Some(port_to_save), + ..IVerge::default() + }); + verge_data.save_file() + }) + .await??; // First ? for spawn_blocking error, second for save_file Result + + tokio::task::spawn_blocking(move || { + let clash_config_accessor = Config::clash(); // Extend lifetime of the accessor + let mut clash_data = clash_config_accessor.data(); // Access within blocking task, made mutable + let mut mapping = Mapping::new(); + mapping.insert("mixed-port".into(), port_to_save.into()); + clash_data.patch_config(mapping); + clash_data.save_config() + }) + .await??; - let mut mapping = Mapping::new(); - mapping.insert("mixed-port".into(), port.into()); - clash_config.data().patch_config(mapping); - clash_config.data().save_config()?; Ok(()) }