if(CommandLineManager.Current.RestartPid!=-1){Log.Info($"Waiting for another NETworkManager process with Pid {CommandLineManager.Current.RestartPid} to exit...");varprocessList=Process.GetProcesses();varprocess=processList.FirstOrDefault(x=>x.Id==CommandLineManager.Current.RestartPid);process?.WaitForExit();Log.Info($"NETworkManager process with Pid {CommandLineManager.Current.RestartPid} has been exited.");}
varmutexIsAcquired=_mutex.WaitOne(TimeSpan.Zero,true);Log.Info($"Mutex value for {Guid} is {mutexIsAcquired}");// Release mutexif(mutexIsAcquired)_mutex.ReleaseMutex();// If another instance is running, bring it to the foregroundif(!mutexIsAcquired&&!SettingsManager.Current.Window_MultipleInstances){// Bring the already running application into the foregroundLog.Info("Another NETworkManager process is already running. Trying to bring the window to the foreground...");SingleInstance.PostMessage(SingleInstance.HWND_BROADCAST,SingleInstance.WM_SHOWME,IntPtr.Zero,IntPtr.Zero);// Close the application_singleInstanceClose=true;Shutdown();return;}
接下来会显示启动画面窗口和主窗口:
1
2
3
4
5
6
7
8
9
10
// Show splash screenif(SettingsManager.Current.SplashScreen_Enabled){Log.Info("Show SplashScreen while application is loading...");newSplashScreen(@"SplashScreen.png").Show(true,true);}// Show main windowLog.Info("Set StartupUri to MainWindow.xaml...");StartupUri=newUri("MainWindow.xaml",UriKind.Relative);
启动流程如下:
图表代码
flowchart TD
A[Application_Startup] --> B[启动日志]
B --> C[异常捕获]
C --> D[检查旧实例]
D --> E[加载Policy]
E --> F[加载Settings]
F --> G[升级配置]
G --> H[初始化语言]
H --> I[单实例检测]
I --> J[启动后台任务]
J --> K[调整线程池]
K --> L[SplashScreen]
L --> M[MainWindow]
flowchart TD
A[Application_Startup] --> B[启动日志]
B --> C[异常捕获]
C --> D[检查旧实例]
D --> E[加载Policy]
E --> F[加载Settings]
F --> G[升级配置]
G --> H[初始化语言]
H --> I[单实例检测]
I --> J[启动后台任务]
J --> K[调整线程池]
K --> L[SplashScreen]
L --> M[MainWindow]
flowchart TD
A[Application_Startup] --> B[启动日志]
B --> C[异常捕获]
C --> D[检查旧实例]
D --> E[加载Policy]
E --> F[加载Settings]
F --> G[升级配置]
G --> H[初始化语言]
H --> I[单实例检测]
I --> J[启动后台任务]
J --> K[调整线程池]
K --> L[SplashScreen]
L --> M[MainWindow]
1
2
3
4
5
6
7
8
9
10
11
12
13
flowchart TD
A[Application_Startup] --> B[启动日志]
B --> C[异常捕获]
C --> D[检查旧实例]
D --> E[加载Policy]
E --> F[加载Settings]
F --> G[升级配置]
G --> H[初始化语言]
H --> I[单实例检测]
I --> J[启动后台任务]
J --> K[调整线程池]
K --> L[SplashScreen]
L --> M[MainWindow]
/// <summary>/// Checks the computer connection./// </summary>/// <param name="ct">The cancellation token.</param>/// <returns>A task representing the asynchronous operation.</returns>privateTaskCheckConnectionComputerAsync(CancellationTokenct){returnTask.Run(async()=>{Log.Debug("CheckConnectionComputerAsync - Checking local connection...");// Init variablesIsComputerIPv4Checking=true;ComputerIPv4="";ComputerIPv4State=ConnectionState.None;IsComputerIPv6Checking=true;ComputerIPv6="";ComputerIPv6State=ConnectionState.None;IsComputerDNSChecking=true;ComputerDNS="";ComputerDNSState=ConnectionState.None;// Detect local IPv4 addressLog.Debug("CheckConnectionComputerAsync - Detecting local IPv4 address...");vardetectedLocalIPv4Address=awaitNetworkInterface.DetectLocalIPAddressBasedOnRoutingAsync(IPAddress.Parse(SettingsManager.Current.Dashboard_PublicIPv4Address));if(detectedLocalIPv4Address==null){Log.Debug("CheckConnectionComputerAsync - Local IPv4 address detection via routing failed, trying network interfaces...");detectedLocalIPv4Address=awaitNetworkInterface.DetectLocalIPAddressFromNetworkInterfaceAsync(AddressFamily.InterNetwork);}if(detectedLocalIPv4Address!=null){Log.Debug("CheckConnectionComputerAsync - Local IPv4 address detected: "+detectedLocalIPv4Address);ComputerIPv4=detectedLocalIPv4Address.ToString();ComputerIPv4State=string.IsNullOrEmpty(ComputerIPv4)?ConnectionState.Critical:ConnectionState.OK;}else{Log.Debug("CheckConnectionComputerAsync - Local IPv4 address not detected.");ComputerIPv4="-/-";ComputerIPv4State=ConnectionState.Critical;}IsComputerIPv4Checking=false;if(ct.IsCancellationRequested)ct.ThrowIfCancellationRequested();// Detect local IPv6 addressLog.Debug("CheckConnectionComputerAsync - Detecting local IPv6 address...");vardetectedLocalIPv6Address=awaitNetworkInterface.DetectLocalIPAddressBasedOnRoutingAsync(IPAddress.Parse(SettingsManager.Current.Dashboard_PublicIPv6Address));if(detectedLocalIPv6Address==null){Log.Debug("CheckConnectionComputerAsync - Local IPv6 address detection via routing failed, trying network interfaces...");detectedLocalIPv6Address=awaitNetworkInterface.DetectLocalIPAddressFromNetworkInterfaceAsync(AddressFamily.InterNetworkV6);}if(detectedLocalIPv6Address!=null){Log.Debug("CheckConnectionComputerAsync - Local IPv6 address detected: "+detectedLocalIPv6Address);ComputerIPv6=detectedLocalIPv6Address.ToString();ComputerIPv6State=string.IsNullOrEmpty(ComputerIPv6)?ConnectionState.Critical:ConnectionState.OK;}else{Log.Debug("CheckConnectionComputerAsync - Local IPv6 address not detected.");ComputerIPv6="-/-";ComputerIPv6State=ConnectionState.Critical;}IsComputerIPv6Checking=false;if(ct.IsCancellationRequested)ct.ThrowIfCancellationRequested();// Try to resolve local DNS based on IPv4if(ComputerIPv4State==ConnectionState.OK){Log.Debug("CheckConnectionComputerAsync - Resolving local DNS based on IPv4...");vardnsResult=awaitDNSClient.GetInstance().ResolvePtrAsync(IPAddress.Parse(ComputerIPv4));if(!dnsResult.HasError){Log.Debug("CheckConnectionComputerAsync - Local DNS based on IPv4 resolved: "+dnsResult.Value);ComputerDNS=dnsResult.Value;ComputerDNSState=ConnectionState.OK;}else{Log.Debug("CheckConnectionComputerAsync - Local DNS based on IPv4 not resolved.");}}else{Log.Debug("CheckConnectionComputerAsync - Local DNS based on IPv4 not resolved due to invalid IPv4 address.");}// Try to resolve local DNS based on IPv6 if IPv4 failedif(string.IsNullOrEmpty(ComputerDNS)&&ComputerIPv6State==ConnectionState.OK){Log.Debug("CheckConnectionComputerAsync - Resolving local DNS based on IPv6...");vardnsResult=awaitDNSClient.GetInstance().ResolvePtrAsync(IPAddress.Parse(ComputerIPv6));if(!dnsResult.HasError){Log.Debug("CheckConnectionComputerAsync - Local DNS based on IPv6 resolved: "+dnsResult.Value);ComputerDNS=dnsResult.Value;ComputerDNSState=ConnectionState.OK;}else{Log.Debug("CheckConnectionComputerAsync - Local DNS based on IPv6 not resolved.");}}else{Log.Debug("CheckConnectionComputerAsync - Local DNS based on IPv6 not resolved due to IPv4 DNS resolved or invalid IPv6 address");}if(string.IsNullOrEmpty(ComputerDNS)){ComputerDNS="-/-";ComputerDNSState=ConnectionState.Critical;}IsComputerDNSChecking=false;Log.Debug("CheckConnectionComputerAsync - Local connection check completed.");},ct);}
IPInterfaceStatisticsstats;try{// IPStatistics covers both IPv4 and IPv6 traffic on the interface.stats=_networkInterface.GetIPStatistics();}catch(NetworkInformationException){// Transient failure (e.g. adapter going down) - skip this tick.return;}vartotalBytesSent=stats.BytesSent;vartotalBytesReceived=stats.BytesReceived;
publicApplicationInfoSelectedApplication{get;set{// Do not change the application view if the application view is loadingif(_isApplicationViewLoading)return;// Should only be null if we try to re-set the selected application via searchif(value==null&&!_applicationViewIsEmpty)return;// Don't update the application view if the application is the sameif(Equals(value,field))return;if(value!=null&&!_applicationViewIsEmpty){// Hide the old application viewif(field!=null)OnApplicationViewHide(field.Name);// Show the new application viewOnApplicationViewVisible(value.Name);// Store the last selected application nameConfigurationManager.Current.CurrentApplication=value.Name;}field=value;OnPropertyChanged();}}
// Language metadataLanguageProperty.OverrideMetadata(typeof(FrameworkElement),newFrameworkPropertyMetadata(XmlLanguage.GetLanguage(LocalizationManager.GetInstance().Culture.IetfLanguageTag)));
publicvoidCheckOnGitHub(stringuserName,stringprojectName,VersioncurrentVersion,boolincludePreRelease){Task.Run(()=>{try{Log.Info("Checking for new version on GitHub...");// Create GitHub clientvarclient=newGitHubClient(newProductHeaderValue(userName+"_"+projectName));// Get latest or pre-release versionvarrelease=includePreRelease?client.Repository.Release.GetAll(userName,projectName).Result[0]:client.Repository.Release.GetLatest(userName,projectName).Result;// Compare versions (tag=2021.2.15.0, version=2021.2.15.0)if(newVersion(release.TagName)>currentVersion){Log.Info($"Version \"{release.TagName}\" is available!");OnUpdateAvailable(newUpdateAvailableArgs(release));}else{Log.Info("No newer version found!");OnNoUpdateAvailable();}}catch(Exceptionex){Log.Error("Error while checking for new version on GitHub!",ex);OnError();}});}