diff --git a/src-tauri/src/cmd/system.rs b/src-tauri/src/cmd/system.rs index a109180c..7499bfb8 100644 --- a/src-tauri/src/cmd/system.rs +++ b/src-tauri/src/cmd/system.rs @@ -23,7 +23,7 @@ static APP_START_TIME: Lazy = Lazy::new(|| { #[tauri::command] pub async fn export_diagnostic_info() -> CmdResult<()> { - let sysinfo = PlatformSpecification::new(); + let sysinfo = PlatformSpecification::new_async().await; let info = format!("{:?}", sysinfo); let app_handle = handle::Handle::global().app_handle().unwrap(); @@ -36,7 +36,7 @@ pub async fn export_diagnostic_info() -> CmdResult<()> { #[tauri::command] pub async fn get_system_info() -> CmdResult { - let sysinfo = PlatformSpecification::new(); + let sysinfo = PlatformSpecification::new_async().await; let info = format!("{:?}", sysinfo); Ok(info) } diff --git a/src-tauri/src/feat/clash.rs b/src-tauri/src/feat/clash.rs index 70effb0d..5950806e 100644 --- a/src-tauri/src/feat/clash.rs +++ b/src-tauri/src/feat/clash.rs @@ -29,25 +29,31 @@ pub fn restart_app() { tauri::async_runtime::spawn_blocking(|| { tauri::async_runtime::block_on(async { logging_error!(Type::Core, true, CoreManager::global().stop_core().await); + resolve::resolve_reset_async().await; + let app_handle = handle::Handle::global().app_handle().unwrap(); + std::thread::sleep(std::time::Duration::from_secs(1)); + tauri::process::restart(&app_handle.env()); }); - resolve::resolve_reset(); - let app_handle = handle::Handle::global().app_handle().unwrap(); - std::thread::sleep(std::time::Duration::from_secs(1)); - tauri::process::restart(&app_handle.env()); }); } fn after_change_clash_mode() { - let _ = tauri::async_runtime::block_on(tauri::async_runtime::spawn_blocking(|| { - tauri::async_runtime::block_on(async { - let connections = MihomoManager::global().get_connections().await.unwrap(); - let connections = connections["connections"].as_array().unwrap(); - for connection in connections { - let id = connection["id"].as_str().unwrap(); - let _ = MihomoManager::global().delete_connection(id).await; + tauri::async_runtime::spawn(async { + match MihomoManager::global().get_connections().await { + Ok(connections) => { + if let Some(connections_array) = connections["connections"].as_array() { + for connection in connections_array { + if let Some(id) = connection["id"].as_str() { + let _ = MihomoManager::global().delete_connection(id).await; + } + } + } } - }) - })); + Err(err) => { + log::error!(target: "app", "Failed to get connections: {}", err); + } + } + }); } /// Change Clash mode (rule/global/direct/script) diff --git a/src-tauri/src/module/sysinfo.rs b/src-tauri/src/module/sysinfo.rs index 4fd4eb5b..975ade8c 100644 --- a/src-tauri/src/module/sysinfo.rs +++ b/src-tauri/src/module/sysinfo.rs @@ -36,13 +36,8 @@ impl PlatformSpecification { let config = handler.config(); let verge_version = config.version.clone().unwrap_or("Null".into()); - // Get running mode asynchronously - let running_mode = tokio::task::block_in_place(|| { - tokio::runtime::Handle::current().block_on(async { - let running_mode = CoreManager::global().get_running_mode().await; - running_mode.to_string() - }) - }); + // 使用默认值避免在同步上下文中执行异步操作 + let running_mode = "NotRunning".to_string(); let is_admin = match system::is_admin() { Ok(value) => value, @@ -59,4 +54,14 @@ impl PlatformSpecification { is_admin, } } + + // 异步方法来获取完整的系统信息 + pub async fn new_async() -> Self { + let mut info = Self::new(); + + let running_mode = CoreManager::global().get_running_mode().await; + info.running_mode = running_mode.to_string(); + + info + } } diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 29f831cc..b0875a86 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -130,26 +130,24 @@ pub async fn resolve_setup(app: &mut App) { } } -/// reset system proxy -pub fn resolve_reset() { - tauri::async_runtime::block_on(async move { - #[cfg(target_os = "macos")] - logging!(info, Type::Tray, true, "Unsubscribing from traffic updates"); - #[cfg(target_os = "macos")] - tray::Tray::global().unsubscribe_traffic(); +/// reset system proxy (异步版) +pub async fn resolve_reset_async() { + #[cfg(target_os = "macos")] + logging!(info, Type::Tray, true, "Unsubscribing from traffic updates"); + #[cfg(target_os = "macos")] + tray::Tray::global().unsubscribe_traffic(); - logging_error!( - Type::System, - true, - sysopt::Sysopt::global().reset_sysproxy().await - ); - logging_error!(Type::Core, true, CoreManager::global().stop_core().await); - #[cfg(target_os = "macos")] - { - logging!(info, Type::System, true, "Restoring system DNS settings"); - restore_public_dns().await; - } - }); + logging_error!( + Type::System, + true, + sysopt::Sysopt::global().reset_sysproxy().await + ); + logging_error!(Type::Core, true, CoreManager::global().stop_core().await); + #[cfg(target_os = "macos")] + { + logging!(info, Type::System, true, "Restoring system DNS settings"); + restore_public_dns().await; + } } /// create main window