diff --git a/Netch/Controllers/Interface/Instance.cs b/Netch/Controllers/Interface/Instance.cs index f1190cca..6b41bdf7 100644 --- a/Netch/Controllers/Interface/Instance.cs +++ b/Netch/Controllers/Interface/Instance.cs @@ -105,7 +105,7 @@ namespace Netch.Controllers /// 主程序启动参数 /// 进程优先级 /// 是否成功启动 - protected bool StartInstanceAuto(string argument, ProcessPriorityClass priority = ProcessPriorityClass.Normal) + protected bool StartInstanceAuto(string argument, ProcessPriorityClass priority = ProcessPriorityClass.RealTime) { State = State.Starting; try @@ -183,14 +183,14 @@ namespace Netch.Controllers /// /// 发送者 /// 数据 - protected async void OnOutputDataReceived(object sender, DataReceivedEventArgs e) + protected void OnOutputDataReceived(object sender, DataReceivedEventArgs e) { // 程序结束, 接收到 null if (e.Data == null) return; var info = Encoding.GetEncoding(InstanceOutputEncoding).GetBytes(e.Data + Global.EOF); - await Write(info); + Task.Run(() => Write(info)); var str = Encoding.UTF8.GetString(info); // 检查启动 if (State == State.Starting) @@ -220,19 +220,24 @@ namespace Netch.Controllers } } + private readonly object _fileLocker = new object(); + /// /// 写入日志文件流 /// /// /// 转码后的字符串 - private async Task Write(byte[] info) + private void Write(byte[] info) { if (info == null) return; try { - await _logFileStream.WriteAsync(info, 0, info.Length); + lock (_fileLocker) + { + _logFileStream.Write(info, 0, info.Length); + } } catch (Exception e) { diff --git a/Netch/Controllers/MainController.cs b/Netch/Controllers/MainController.cs index d965f347..23514364 100644 --- a/Netch/Controllers/MainController.cs +++ b/Netch/Controllers/MainController.cs @@ -72,7 +72,7 @@ namespace Netch.Controllers /// 服务器 /// 模式 /// 是否启动成功 - public bool Start(Server server, Mode mode) + public async Task Start(Server server, Mode mode) { Logging.Info($"启动主控制器: {server.Type} [{mode.Type}]{mode.Remark}"); @@ -88,6 +88,7 @@ namespace Netch.Controllers #endregion FlushDNSResolverCache(); + _ = Task.Run(Firewall.AddNetchFwRules); bool result; if (server.Type == "Socks5") @@ -111,17 +112,17 @@ namespace Netch.Controllers var isPortNotAvailable = false; if (_savedServer.Type != "Socks5") { - isPortNotAvailable = PortCheckAndShowMessageBox(_socks5Port, "Socks5"); + isPortNotAvailable |= PortCheckAndShowMessageBox(_socks5Port, "Socks5"); } switch (_savedMode.Type) { case 0: - isPortNotAvailable = isPortNotAvailable || PortCheckAndShowMessageBox(_redirectorTCPPort, "Redirector TCP"); + isPortNotAvailable |= PortCheckAndShowMessageBox(_redirectorTCPPort, "Redirector TCP"); break; case 3: case 5: - isPortNotAvailable = isPortNotAvailable || PortCheckAndShowMessageBox(_httpPort, "HTTP"); + isPortNotAvailable |= PortCheckAndShowMessageBox(_httpPort, "HTTP"); break; } @@ -132,7 +133,7 @@ namespace Netch.Controllers } Global.MainForm.StatusText(i18N.Translate("Starting ", pEncryptedProxyController.Name)); - result = pEncryptedProxyController.Start(server, mode); + result = await Task.Run(() => pEncryptedProxyController.Start(server, mode)); } if (result) @@ -161,7 +162,7 @@ namespace Netch.Controllers if (pModeController != null) { Global.MainForm.StatusText(i18N.Translate("Starting ", pModeController.Name)); - result = pModeController.Start(server, mode); + result = await Task.Run(() => pModeController.Start(server, mode)); } if (result) @@ -179,13 +180,12 @@ namespace Netch.Controllers break; } - switch (mode.Type) { case 0: case 1: case 2: - Task.Run(() => + _ = Task.Run(() => { Global.MainForm.NatTypeStatusText(i18N.Translate("Starting NatTester")); // Thread.Sleep(1000); @@ -202,7 +202,7 @@ namespace Netch.Controllers if (!result) { Logging.Error("主控制器启动失败"); - Stop(); + await Stop(); } return result; @@ -211,15 +211,16 @@ namespace Netch.Controllers /// /// 停止 /// - public async void Stop() + public async Task Stop() { - await Task.WhenAll(new[] + var tasks = new Task[] { Task.Run(() => pEncryptedProxyController?.Stop()), Task.Run(() => UsingPorts.Clear()), Task.Run(() => pModeController?.Stop()), Task.Run(() => pNTTController.Stop()) - }); + }; + await Task.WhenAll(tasks); } public static void KillProcessByName(string name) diff --git a/Netch/Controllers/Mode/NFController.cs b/Netch/Controllers/Mode/NFController.cs index 9c2dbcdd..697e9711 100644 --- a/Netch/Controllers/Mode/NFController.cs +++ b/Netch/Controllers/Mode/NFController.cs @@ -175,18 +175,9 @@ namespace Netch.Controllers } if (!File.Exists(SystemDriver)) return true; - - try - { - NFAPI.nf_unRegisterDriver("netfilter2"); - } - catch (Exception e) - { - Logging.Error(e.ToString()); - return false; - } - + NFAPI.nf_unRegisterDriver("netfilter2"); File.Delete(SystemDriver); + return true; } diff --git a/Netch/Forms/MainForm.Control.cs b/Netch/Forms/MainForm.Control.cs index 3c0baee2..866fa77a 100644 --- a/Netch/Forms/MainForm.Control.cs +++ b/Netch/Forms/MainForm.Control.cs @@ -40,26 +40,22 @@ namespace Netch.Forms State = State.Starting; - await Task.Run(Firewall.AddNetchFwRules); - var server = ServerComboBox.SelectedItem as Models.Server; var mode = ModeComboBox.SelectedItem as Models.Mode; var result = false; - await Task.Run(() => + try { - try - { - // TODO 完善控制器异常处理 - result = _mainController.Start(server, mode); - } - catch (Exception e) - { - if (e is DllNotFoundException || e is FileNotFoundException) - MessageBoxX.Show(e.Message + "\n\n" + i18N.Translate("Missing File or runtime components"), owner: this); - Netch.Application_OnException(null, new ThreadExceptionEventArgs(e)); - } - }); + // TODO 完善控制器异常处理 + result = await _mainController.Start(server, mode); + } + catch (Exception e) + { + if (e is DllNotFoundException || e is FileNotFoundException) + MessageBoxX.Show(e.Message + "\n\n" + i18N.Translate("Missing File or runtime components"), owner: this); + Netch.Application_OnException(null, new ThreadExceptionEventArgs(e)); + } + if (result) { @@ -106,7 +102,7 @@ namespace Netch.Forms { // 停止 State = State.Stopping; - _mainController.Stop(); + await _mainController.Stop(); State = State.Stopped; _ = Task.Run(TestServer); } diff --git a/Netch/Forms/MainForm.MenuStrip.cs b/Netch/Forms/MainForm.MenuStrip.cs index 28da224d..1e75d258 100644 --- a/Netch/Forms/MainForm.MenuStrip.cs +++ b/Netch/Forms/MainForm.MenuStrip.cs @@ -128,7 +128,7 @@ namespace Netch.Forms Remark = "ProxyUpdate", Type = 5 }; - _mainController.Start(ServerComboBox.SelectedItem as Models.Server, mode); + await _mainController.Start(ServerComboBox.SelectedItem as Models.Server, mode); } var serverLock = new object(); @@ -157,16 +157,14 @@ namespace Netch.Forms lock (serverLock) { Global.Settings.Server = Global.Settings.Server.Where(server => server.Group != item.Remark).ToList(); - } + var result = ShareLink.Parse(str); + if (result != null) + { + foreach (var x in result) x.Group = item.Remark; - var result = ShareLink.Parse(str); - - if (result != null) - { - foreach (var x in result) x.Group = item.Remark; - - Global.Settings.Server.AddRange(result); - NotifyTip(i18N.TranslateFormat("Update {1} server(s) from {0}", item.Remark, result.Count)); + Global.Settings.Server.AddRange(result); + NotifyTip(i18N.TranslateFormat("Update {1} server(s) from {0}", item.Remark, result.Count)); + } } } catch (WebException e) @@ -186,7 +184,7 @@ namespace Netch.Forms if (Global.Settings.UseProxyToUpdateSubscription) { - _mainController.Stop(); + await _mainController.Stop(); } } @@ -199,13 +197,10 @@ namespace Netch.Forms Utils.Utils.Open(".\\"); } - private void CleanDNSCacheToolStripMenuItem_Click(object sender, EventArgs e) + private async void CleanDNSCacheToolStripMenuItem_Click(object sender, EventArgs e) { - Task.Run(() => - { - DNS.Cache.Clear(); - NotifyTip(i18N.Translate("DNS cache cleanup succeeded")); - }); + await Task.Run(() => DNS.Cache.Clear()); + StatusText(i18N.Translate("DNS cache cleanup succeeded")); } private void ReloadModesToolStripMenuItem_Click(object sender, EventArgs e) @@ -246,95 +241,83 @@ namespace Netch.Forms DisableItems(false); - await Task.Run(async () => + if (useProxy) + { + var mode = new Models.Mode + { + Remark = "ProxyUpdate", + Type = 5 + }; + State = State.Starting; + await _mainController.Start(ServerComboBox.SelectedItem as Models.Server, mode); + } + + NotifyTip(i18N.Translate("Updating in the background")); + try + { + var req = WebUtil.CreateRequest(Global.Settings.ACL); + if (useProxy) + req.Proxy = new WebProxy($"http://127.0.0.1:{Global.Settings.HTTPLocalPort}"); + + await WebUtil.DownloadFileAsync(req, Path.Combine(Global.NetchDir, "bin\\default.acl")); + NotifyTip(i18N.Translate("ACL updated successfully")); + } + catch (Exception e) + { + NotifyTip(i18N.Translate("ACL update failed") + "\n" + e.Message, info: false); + Logging.Error("更新 ACL 失败!" + e); + } + finally { if (useProxy) { - var mode = new Models.Mode - { - Remark = "ProxyUpdate", - Type = 5 - }; - State = State.Starting; - _mainController.Start(ServerComboBox.SelectedItem as Models.Server, mode); + await _mainController.Stop(); + State = State.Stopped; } - NotifyTip(i18N.Translate("Updating in the background")); - try - { - var req = WebUtil.CreateRequest(Global.Settings.ACL); - if (useProxy) - req.Proxy = new WebProxy($"http://127.0.0.1:{Global.Settings.HTTPLocalPort}"); - - await WebUtil.DownloadFileAsync(req, Path.Combine(Global.NetchDir, "bin\\default.acl")); - NotifyTip(i18N.Translate("ACL updated successfully")); - } - catch (Exception e) - { - NotifyTip(i18N.Translate("ACL update failed") + "\n" + e.Message, info: false); - Logging.Error("更新 ACL 失败!" + e); - } - finally - { - if (useProxy) - { - _mainController.Stop(); - State = State.Stopped; - } - - DisableItems(true); - } - }); + DisableItems(true); + } } - - private void UninstallServiceToolStripMenuItem_Click(object sender, EventArgs e) + private async void UninstallServiceToolStripMenuItem_Click(object sender, EventArgs e) { Enabled = false; StatusText(i18N.Translate("Uninstalling NF Service")); - Task.Run(() => + var result = false; + try { - try + await Task.Run(() => result = NFController.UninstallDriver()); + if (result) { - if (NFController.UninstallDriver()) - { - StatusText(i18N.Translate("Service has been uninstalled")); - } + StatusText(i18N.Translate("Service has been uninstalled")); } - catch (Exception e) - { - MessageBoxX.Show(e.ToString(), LogLevel.ERROR); - Console.WriteLine(e); - throw; - } - + } + finally + { Enabled = true; - }); + } } - private void reinstallTapDriverToolStripMenuItem_Click(object sender, EventArgs e) + private async void reinstallTapDriverToolStripMenuItem_Click(object sender, EventArgs e) { - Task.Run(() => + StatusText(i18N.Translate("Reinstalling TUN/TAP driver")); + Enabled = false; + await Task.Run(() => { - StatusText(i18N.Translate("Reinstalling TUN/TAP driver")); - Enabled = false; try { Configuration.deltapall(); Configuration.addtap(); - NotifyTip(i18N.Translate("Reinstall TUN/TAP driver successfully")); + StatusText(i18N.Translate("Reinstall TUN/TAP driver successfully")); } catch { NotifyTip(i18N.Translate("Reinstall TUN/TAP driver failed"), info: false); } - finally - { - State = State.Waiting; - Enabled = true; - } }); + State = State.Waiting; + Enabled = true; } #endregion diff --git a/Netch/Forms/MainForm.Profile.cs b/Netch/Forms/MainForm.Profile.cs index 76a74eb5..e6f67ed0 100644 --- a/Netch/Forms/MainForm.Profile.cs +++ b/Netch/Forms/MainForm.Profile.cs @@ -9,7 +9,10 @@ using Netch.Utils; namespace Netch.Forms { - public partial class Dummy { } + public partial class Dummy + { + } + partial class MainForm { /// init at @@ -136,7 +139,7 @@ namespace Netch.Forms private List