Pārlūkot izejas kodu

消息路径引入优先级概念,从而可以通过优先级对相同消息类型的路径进行排序,从而为消减一些纯粹为了执行顺序而存在的消息类型做准备

anycmd 4 gadi atpakaļ
vecāks
revīzija
df196c4653
100 mainītis faili ar 738 papildinājumiem un 740 dzēšanām
  1. 4 4
      src/AppModels/AppRoot.cs
  2. 8 8
      src/AppModels/AppRoot.partials.CoinGroupViewModels.cs
  3. 10 10
      src/AppModels/AppRoot.partials.CoinKernelViewModels.cs
  4. 8 10
      src/AppModels/AppRoot.partials.CoinProfileViewModels.cs
  5. 16 16
      src/AppModels/AppRoot.partials.CoinViewModels.cs
  6. 10 10
      src/AppModels/AppRoot.partials.FileWriterViewModels.cs
  7. 10 10
      src/AppModels/AppRoot.partials.FragmentWriterViewModels.cs
  8. 4 4
      src/AppModels/AppRoot.partials.GpuProfileViewModels.cs
  9. 20 20
      src/AppModels/AppRoot.partials.GpuSpeedViewModels.cs
  10. 8 8
      src/AppModels/AppRoot.partials.GpuViewModels.cs
  11. 10 10
      src/AppModels/AppRoot.partials.GroupViewModels.cs
  12. 10 10
      src/AppModels/AppRoot.partials.KernelInputViewModels.cs
  13. 9 9
      src/AppModels/AppRoot.partials.KernelOutputKeywordViewModels.cs
  14. 10 10
      src/AppModels/AppRoot.partials.KernelOutputTranslaterViewModels.cs
  15. 10 10
      src/AppModels/AppRoot.partials.KernelOutputViewModels.cs
  16. 10 10
      src/AppModels/AppRoot.partials.KernelViewModels.cs
  17. 10 10
      src/AppModels/AppRoot.partials.PackageViewModels.cs
  18. 10 10
      src/AppModels/AppRoot.partials.PoolKernelViewModels.cs
  19. 4 4
      src/AppModels/AppRoot.partials.PoolProfileViewModels.cs
  20. 10 10
      src/AppModels/AppRoot.partials.PoolViewModels.cs
  21. 2 2
      src/AppModels/AppRoot.partials.ShareViewModels.cs
  22. 10 10
      src/AppModels/AppRoot.partials.SysDicItemViewModels.cs
  23. 10 10
      src/AppModels/AppRoot.partials.SysDicViewModels.cs
  24. 9 9
      src/AppModels/AppRoot.partials.WalletViewModels.cs
  25. 2 2
      src/AppModels/ExtendedNotifyIcon.cs
  26. 4 4
      src/AppModels/MinerStudio/MinerStudioRoot.partials.ColumnsShowViewModels.cs
  27. 8 8
      src/AppModels/MinerStudio/MinerStudioRoot.partials.MineWorkViewModels.cs
  28. 8 8
      src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerClientConsoleViewModel.cs
  29. 7 7
      src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerClientMessagesViewModel.cs
  30. 8 8
      src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerClientOperationResultsViewModel.cs
  31. 8 8
      src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerGroupViewModels.cs
  32. 8 8
      src/AppModels/MinerStudio/MinerStudioRoot.partials.NTMinerWalletViewModels.cs
  33. 8 8
      src/AppModels/MinerStudio/MinerStudioRoot.partials.OverClockDataViewModels.cs
  34. 2 2
      src/AppModels/MinerStudio/Vms/MineWorkViewModel.cs
  35. 10 10
      src/AppModels/MinerStudio/Vms/MinerClientsWindowViewModel.cs
  36. 2 2
      src/AppModels/MinerStudio/Vms/NTMinerFileSelectViewModel.cs
  37. 2 2
      src/AppModels/View/AbstractAppViewFactory.cs
  38. 2 2
      src/AppModels/Vms/KernelOutputKeywordsViewModel.cs
  39. 6 6
      src/AppModels/Vms/LocalMessagesViewModel.cs
  40. 2 2
      src/AppModels/Vms/MainMenuViewModel.cs
  41. 20 20
      src/AppModels/Vms/MinerProfileViewModel.cs
  42. 6 6
      src/AppModels/Vms/ServerMessagesViewModel.cs
  43. 4 4
      src/AppModels/Vms/StartStopMineButtonViewModel.cs
  44. 131 131
      src/AppViews0/AppViewFactory.cs
  45. 2 2
      src/AppViews0/MinerStudio/Views/MinerClientsWindow.xaml.cs
  46. 2 2
      src/AppViews0/MinerStudio/Views/Ucs/CalcConfig.xaml.cs
  47. 2 2
      src/AppViews0/MinerStudio/Views/Ucs/GpuProfilesPage.xaml.cs
  48. 2 2
      src/AppViews0/MinerStudio/Views/Ucs/LocalIpConfig.xaml.cs
  49. 2 2
      src/AppViews0/MinerStudio/Views/Ucs/MinerClient.xaml.cs
  50. 6 6
      src/AppViews0/MinerStudio/Views/Ucs/UserPage.xaml.cs
  51. 2 2
      src/AppViews0/MinerStudio/Views/Ucs/VirtualMemory.xaml.cs
  52. 2 2
      src/AppViews0/MinerStudio/Views/Ucs/WsServerNodePage.xaml.cs
  53. 4 4
      src/AppViews0/Views/KernelsWindow.xaml.cs
  54. 8 8
      src/AppViews0/Views/MainWindow.xaml.cs
  55. 4 4
      src/AppViews0/Views/Ucs/Calc.xaml.cs
  56. 4 4
      src/AppViews0/Views/Ucs/CoinKernelSelect.xaml.cs
  57. 4 4
      src/AppViews0/Views/Ucs/CoinSelect.xaml.cs
  58. 2 2
      src/AppViews0/Views/Ucs/InnerProperty.xaml.cs
  59. 2 2
      src/AppViews0/Views/Ucs/MinerProfileDual.xaml.cs
  60. 2 2
      src/AppViews0/Views/Ucs/MinerProfileIndex.xaml.cs
  61. 2 2
      src/AppViews0/Views/Ucs/MinerProfileOption.xaml.cs
  62. 2 2
      src/AppViews0/Views/Ucs/RestartWindows.xaml.cs
  63. 4 4
      src/AppViews0/Views/Ucs/ServerMessages.xaml.cs
  64. 2 2
      src/AppViews0/Views/Ucs/SpeedCharts.xaml.cs
  65. 18 18
      src/AppViews0/Views/Ucs/StateBar.xaml.cs
  66. 4 4
      src/AppViews0/Views/Ucs/WalletSelect.xaml.cs
  67. 2 2
      src/CalcConfigUpdater/Program.cs
  68. 30 30
      src/MinerClient/App.xaml.cs
  69. 2 2
      src/MinerClientFinder/Vms/MainWindowViewModel.cs
  70. 2 2
      src/MinerClientSelfHost/HttpServer.cs
  71. 10 10
      src/MinerStudio/App.xaml.cs
  72. 2 2
      src/NTMinerClient/Cleaner.cs
  73. 2 2
      src/NTMinerClient/ComputerRoot.cs
  74. 2 2
      src/NTMinerClient/Core/IServerContext.cs
  75. 2 2
      src/NTMinerClient/Core/Impl/CalcConfigSet.cs
  76. 4 4
      src/NTMinerClient/Core/Impl/ClientDataSet.cs
  77. 8 8
      src/NTMinerClient/Core/Impl/LocalMessageSet.cs
  78. 6 6
      src/NTMinerClient/Core/Impl/OverClockDataSet.cs
  79. 2 2
      src/NTMinerClient/Core/Impl/PoolSet.cs
  80. 4 4
      src/NTMinerClient/Core/Impl/ServerContext.cs
  81. 4 4
      src/NTMinerClient/Core/Kernels/Impl/CoinKernelSet.cs
  82. 8 8
      src/NTMinerClient/Core/MinerStudio/Impl/MineWorkSet.cs
  83. 8 8
      src/NTMinerClient/Core/MinerStudio/Impl/MinerGroupSet.cs
  84. 6 6
      src/NTMinerClient/Core/MinerStudio/Impl/NTMinerWalletSet.cs
  85. 2 2
      src/NTMinerClient/Core/MinerStudio/Impl/UserAppSettingSet.cs
  86. 4 4
      src/NTMinerClient/Core/Profiles/Impl/GpuProfileSet.cs
  87. 6 6
      src/NTMinerClient/Core/Profiles/Impl/WalletSet.cs
  88. 9 10
      src/NTMinerClient/Core/Profiles/MinerProfile.cs
  89. 2 2
      src/NTMinerClient/Cpus/Impl/CpuPackage.cs
  90. 2 2
      src/NTMinerClient/Gpus/Impl/AMDGpuSet.cs
  91. 6 6
      src/NTMinerClient/Gpus/Impl/GpusSpeed.cs
  92. 2 2
      src/NTMinerClient/Gpus/Impl/TempGruarder.cs
  93. 10 10
      src/NTMinerClient/Mine/MineContext.cs
  94. 17 17
      src/NTMinerClient/NTMinerContext.cs
  95. 8 8
      src/NTMinerClient/Report/ReportDataProvider.cs
  96. 2 2
      src/NTMinerDaemon/Core/Impl/OperationResultSet.cs
  97. 8 8
      src/NTMinerDaemon/Ws/AbstractWsClient.cs
  98. 2 2
      src/NTMinerDaemon/Ws/DaemonWsClient.cs
  99. 1 1
      src/NTMinerHub/Hub/IMessagePathHub.cs
  100. 1 0
      src/NTMinerHub/Hub/IMessagePathId.cs

+ 4 - 4
src/AppModels/AppRoot.cs

@@ -23,16 +23,16 @@ namespace NTMiner {
 
         #region methods
         // 因为是上下文路径,无需返回路径标识
-        public static void BuildCmdPath<TCmd>(LogEnum logType, Action<TCmd> path, Type location)
+        public static void BuildCmdPath<TCmd>(LogEnum logType, Type location, Action<TCmd> path)
             where TCmd : ICmd {
-            var messagePathId = VirtualRoot.BuildCmdPath(path, location, logType);
+            var messagePathId = VirtualRoot.BuildCmdPath(location, logType, path);
             _contextPathIds.Add(messagePathId);
         }
 
         // 因为是上下文路径,无需返回路径标识
-        public static void BuildEventPath<TEvent>(string description, LogEnum logType, Action<TEvent> path, Type location)
+        public static void BuildEventPath<TEvent>(string description, LogEnum logType, Type location, PathPriority priority, Action<TEvent> path)
             where TEvent : IEvent {
-            var messagePathId = VirtualRoot.BuildMessagePath(description, logType, path, location);
+            var messagePathId = VirtualRoot.BuildMessagePath(description, logType, location, priority, path);
             _contextPathIds.Add(messagePathId);
         }
 

+ 8 - 8
src/AppModels/AppRoot.partials.CoinGroupViewModels.cs

@@ -14,17 +14,17 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
                         _listByGroupId.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         // 什么也不做,因为该集合没有什么属性
-                    }, location: this.GetType());
-                BuildEventPath<CoinGroupAddedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<CoinGroupAddedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             CoinGroupViewModel coinGroupVm = new CoinGroupViewModel(message.Source);
@@ -35,8 +35,8 @@ namespace NTMiner {
                             _listByGroupId[coinGroupVm.GroupId].Add(coinGroupVm);
                             OnGroupPropertyChanged(coinGroupVm.GroupId);
                         }
-                    }, location: this.GetType());
-                BuildEventPath<CoinGroupRemovedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<CoinGroupRemovedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (_dicById.ContainsKey(message.Source.GetId())) {
                             var entity = _dicById[message.Source.GetId()];
@@ -46,7 +46,7 @@ namespace NTMiner {
                             }
                             OnGroupPropertyChanged(entity.GroupId);
                         }
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 10 - 10
src/AppModels/AppRoot.partials.CoinKernelViewModels.cs

@@ -13,16 +13,16 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         OnPropertyChanged(nameof(AllCoinKernels));
-                    }, location: this.GetType());
-                BuildEventPath<CoinKernelAddedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<CoinKernelAddedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         var coinKernelVm = new CoinKernelViewModel(message.Source);
                         _dicById.Add(message.Source.GetId(), coinKernelVm);
@@ -35,8 +35,8 @@ namespace NTMiner {
                             kernelVm.OnPropertyChanged(nameof(kernelVm.SupportedCoins));
                         }
                         VirtualRoot.RaiseEvent(new CoinKernelVmAddedEvent(message));
-                    }, location: this.GetType());
-                BuildEventPath<CoinKernelUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<CoinKernelUpdatedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out CoinKernelViewModel vm)) {
                             var supportedGpu = vm.SupportedGpu;
@@ -54,8 +54,8 @@ namespace NTMiner {
                                 kernelVm.OnPropertyChanged(nameof(kernelVm.CoinKernels));
                             }
                         }
-                    }, location: this.GetType());
-                BuildEventPath<CoinKernelRemovedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<CoinKernelRemovedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out CoinKernelViewModel coinKernelVm)) {
                             _dicById.Remove(message.Source.GetId());
@@ -67,7 +67,7 @@ namespace NTMiner {
                             kernelVm.OnPropertyChanged(nameof(kernelVm.SupportedCoins));
                             VirtualRoot.RaiseEvent(new CoinKernelVmRemovedEvent(message));
                         }
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 8 - 10
src/AppModels/AppRoot.partials.CoinProfileViewModels.cs

@@ -15,28 +15,27 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                BuildEventPath<CoinKernelProfilePropertyChangedEvent>("刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<CoinKernelProfilePropertyChangedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_coinKernelProfileDicById.ContainsKey(message.CoinKernelId)) {
                             _coinKernelProfileDicById[message.CoinKernelId].OnPropertyChanged(message.PropertyName);
                         }
-                    }, location: this.GetType());
-                BuildEventPath<CoinProfilePropertyChangedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<CoinProfilePropertyChangedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_coinProfileDicById.ContainsKey(message.CoinId)) {
                             _coinProfileDicById[message.CoinId].OnPropertyChanged(message.PropertyName);
                         }
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _coinKernelProfileDicById.Clear();
                         _coinProfileDicById.Clear();
-                    }, location: this.GetType());
+                    });
             }
 
             public CoinProfileViewModel GetOrCreateCoinProfile(Guid coinId) {
-                CoinProfileViewModel coinProfile;
-                if (!_coinProfileDicById.TryGetValue(coinId, out coinProfile)) {
+                if (!_coinProfileDicById.TryGetValue(coinId, out CoinProfileViewModel coinProfile)) {
                     lock (_locker) {
                         if (!_coinProfileDicById.TryGetValue(coinId, out coinProfile)) {
                             coinProfile = new CoinProfileViewModel(NTMinerContext.Instance.MinerProfile.GetCoinProfile(coinId));
@@ -48,8 +47,7 @@ namespace NTMiner {
             }
 
             public CoinKernelProfileViewModel GetOrCreateCoinKernelProfileVm(Guid coinKernelId) {
-                CoinKernelProfileViewModel coinKernelProfileVm;
-                if (!_coinKernelProfileDicById.TryGetValue(coinKernelId, out coinKernelProfileVm)) {
+                if (!_coinKernelProfileDicById.TryGetValue(coinKernelId, out CoinKernelProfileViewModel coinKernelProfileVm)) {
                     lock (_locker) {
                         if (!_coinKernelProfileDicById.TryGetValue(coinKernelId, out coinKernelProfileVm)) {
                             coinKernelProfileVm = new CoinKernelProfileViewModel(NTMinerContext.Instance.MinerProfile.GetCoinKernelProfile(coinKernelId));

+ 16 - 16
src/AppModels/AppRoot.partials.CoinViewModels.cs

@@ -16,42 +16,42 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         AllPropertyChanged();
-                    }, location: this.GetType());
-                BuildEventPath<CoinAddedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<CoinAddedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         _dicById.Add(message.Source.GetId(), new CoinViewModel(message.Source));
                         AllPropertyChanged();
                         VirtualRoot.RaiseEvent(new CoinVmAddedEvent(message));
-                    }, location: this.GetType());
-                BuildEventPath<CoinRemovedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<CoinRemovedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Remove(message.Source.GetId());
                         AllPropertyChanged();
                         VirtualRoot.RaiseEvent(new CoinVmRemovedEvent(message));
-                    }, location: this.GetType());
-                BuildEventPath<CoinKernelVmAddedEvent>("刷新币种Vm集的关联内存", LogEnum.DevConsole, path: message => {
+                    });
+                BuildEventPath<CoinKernelVmAddedEvent>("刷新币种Vm集的关联内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     if (_dicById.TryGetValue(message.Event.Source.CoinId, out CoinViewModel coinVm)) {
                         coinVm.OnPropertyChanged(nameof(CoinViewModel.CoinKernel));
                         coinVm.OnPropertyChanged(nameof(CoinViewModel.CoinKernels));
                         coinVm.OnPropertyChanged(nameof(CoinViewModel.IsSupported));
                     }
-                }, this.GetType());
-                BuildEventPath<CoinKernelVmRemovedEvent>("刷新币种Vm集的关联内存", LogEnum.DevConsole, path: message => {
+                });
+                BuildEventPath<CoinKernelVmRemovedEvent>("刷新币种Vm集的关联内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     if (_dicById.TryGetValue(message.Event.Source.CoinId, out CoinViewModel coinVm)) {
                         coinVm.OnPropertyChanged(nameof(CoinViewModel.CoinKernel));
                         coinVm.OnPropertyChanged(nameof(CoinViewModel.CoinKernels));
                         coinVm.OnPropertyChanged(nameof(CoinViewModel.IsSupported));
                     }
-                }, this.GetType());
-                BuildEventPath<CoinUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
+                });
+                BuildEventPath<CoinUpdatedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out CoinViewModel vm)) {
                             bool justAsDualCoin = vm.JustAsDualCoin;
@@ -72,8 +72,8 @@ namespace NTMiner {
                                 OnPropertyChanged(nameof(MainCoins));
                             }
                         }
-                    }, location: this.GetType());
-                BuildEventPath<CoinIconDownloadedEvent>("刷新图标", LogEnum.DevConsole,
+                    });
+                BuildEventPath<CoinIconDownloadedEvent>("刷新图标", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         try {
                             if (string.IsNullOrEmpty(message.Source.Icon)) {
@@ -96,7 +96,7 @@ namespace NTMiner {
                         catch (Exception e) {
                             Logger.ErrorDebugLine(e);
                         }
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 10 - 10
src/AppModels/AppRoot.partials.FileWriterViewModels.cs

@@ -17,34 +17,34 @@ namespace NTMiner {
                 this.Add = new DelegateCommand(() => {
                     new FileWriterViewModel(Guid.NewGuid()).Edit.Execute(FormType.Add);
                 });
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         OnPropertyChangeds();
-                    }, location: this.GetType());
-                BuildEventPath<FileWriterAddedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<FileWriterAddedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             FileWriterViewModel groupVm = new FileWriterViewModel(message.Source);
                             _dicById.Add(message.Source.GetId(), groupVm);
                             OnPropertyChangeds();
                         }
-                    }, location: this.GetType());
-                BuildEventPath<FileWriterUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<FileWriterUpdatedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out FileWriterViewModel vm)) {
                             vm.Update(message.Source);
                         }
-                    }, location: this.GetType());
-                BuildEventPath<FileWriterRemovedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<FileWriterRemovedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         _dicById.Remove(message.Source.GetId());
                         OnPropertyChangeds();
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 10 - 10
src/AppModels/AppRoot.partials.FragmentWriterViewModels.cs

@@ -17,34 +17,34 @@ namespace NTMiner {
                 this.Add = new DelegateCommand(() => {
                     new FragmentWriterViewModel(Guid.NewGuid()).Edit.Execute(FormType.Add);
                 });
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         OnPropertyChangeds();
-                    }, location: this.GetType());
-                BuildEventPath<FragmentWriterAddedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<FragmentWriterAddedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             FragmentWriterViewModel vm = new FragmentWriterViewModel(message.Source);
                             _dicById.Add(message.Source.GetId(), vm);
                             OnPropertyChangeds();
                         }
-                    }, location: this.GetType());
-                BuildEventPath<FragmentWriterUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<FragmentWriterUpdatedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out FragmentWriterViewModel vm)) {
                             vm.Update(message.Source);
                         }
-                    }, location: this.GetType());
-                BuildEventPath<FragmentWriterRemovedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<FragmentWriterRemovedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         _dicById.Remove(message.Source.GetId());
                         OnPropertyChangeds();
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 4 - 4
src/AppModels/AppRoot.partials.GpuProfileViewModels.cs

@@ -16,7 +16,7 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<GpuProfileSetRefreshedEvent>("刷新附着在当前币种上的超频数据", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<GpuProfileSetRefreshedEvent>("刷新附着在当前币种上的超频数据", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         lock (_locker) {
                             _listByCoinId.Clear();
@@ -26,8 +26,8 @@ namespace NTMiner {
                         if (coinVm != null) {
                             coinVm.OnOverClockPropertiesChanges();
                         }
-                    }, location: this.GetType());
-                BuildEventPath<GpuProfileAddedOrUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<GpuProfileAddedOrUpdatedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         lock (_locker) {
                             if (_listByCoinId.TryGetValue(message.Source.CoinId, out List<GpuProfileViewModel> list)) {
@@ -59,7 +59,7 @@ namespace NTMiner {
                                 _listByCoinId.Add(message.Source.CoinId, list);
                             }
                         }
-                    }, location: this.GetType());
+                    });
             }
 
             private readonly object _locker = new object();

+ 20 - 20
src/AppModels/AppRoot.partials.GpuSpeedViewModels.cs

@@ -49,7 +49,7 @@ namespace NTMiner {
                     this._list.Add(new GpuSpeedViewModel(item));
                 }
                 _totalSpeedVm = this._list.FirstOrDefault(a => a.GpuVm.Index == NTMinerContext.GpuAllId);
-                BuildEventPath<GpuShareChangedEvent>("显卡份额变更后刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<GpuShareChangedEvent>("显卡份额变更后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         ResetIfMainCoinSwitched();
                         int index = message.Source.Gpu.Index;
@@ -59,8 +59,8 @@ namespace NTMiner {
                             gpuSpeedVm.MainCoinSpeed.AcceptShare = message.Source.MainCoinSpeed.AcceptShare;
                             gpuSpeedVm.MainCoinSpeed.RejectShare = message.Source.MainCoinSpeed.RejectShare;
                         }
-                    }, location: this.GetType());
-                BuildEventPath<FoundShareIncreasedEvent>("找到一个份额后刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<FoundShareIncreasedEvent>("找到一个份额后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         ResetIfMainCoinSwitched();
                         int index = message.Source.Gpu.Index;
@@ -68,8 +68,8 @@ namespace NTMiner {
                         if (gpuSpeedVm != null) {
                             gpuSpeedVm.MainCoinSpeed.FoundShare = message.Source.MainCoinSpeed.FoundShare;
                         }
-                    }, location: this.GetType());
-                BuildEventPath<AcceptShareIncreasedEvent>("接受一个份额后刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<AcceptShareIncreasedEvent>("接受一个份额后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         ResetIfMainCoinSwitched();
                         int index = message.Source.Gpu.Index;
@@ -77,8 +77,8 @@ namespace NTMiner {
                         if (gpuSpeedVm != null) {
                             gpuSpeedVm.MainCoinSpeed.AcceptShare = message.Source.MainCoinSpeed.AcceptShare;
                         }
-                    }, location: this.GetType());
-                BuildEventPath<AcceptShareSetedEvent>("刷新显卡接受份额VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<AcceptShareSetedEvent>("刷新显卡接受份额VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         ResetIfMainCoinSwitched();
                         int index = message.Source.Gpu.Index;
@@ -86,8 +86,8 @@ namespace NTMiner {
                         if (gpuSpeedVm != null) {
                             gpuSpeedVm.MainCoinSpeed.AcceptShare = message.Source.MainCoinSpeed.AcceptShare;
                         }
-                    }, location: this.GetType());
-                BuildEventPath<RejectShareSetedEvent>("刷新显卡拒绝份额VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<RejectShareSetedEvent>("刷新显卡拒绝份额VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         ResetIfMainCoinSwitched();
                         int index = message.Source.Gpu.Index;
@@ -95,8 +95,8 @@ namespace NTMiner {
                         if (gpuSpeedVm != null) {
                             gpuSpeedVm.MainCoinSpeed.RejectShare = message.Source.MainCoinSpeed.RejectShare;
                         }
-                    }, location: this.GetType());
-                BuildEventPath<IncorrectShareSetedEvent>("刷新显卡计算错误份额VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<IncorrectShareSetedEvent>("刷新显卡计算错误份额VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         ResetIfMainCoinSwitched();
                         int index = message.Source.Gpu.Index;
@@ -104,8 +104,8 @@ namespace NTMiner {
                         if (gpuSpeedVm != null) {
                             gpuSpeedVm.MainCoinSpeed.IncorrectShare = message.Source.MainCoinSpeed.IncorrectShare;
                         }
-                    }, location: this.GetType());
-                BuildEventPath<RejectShareIncreasedEvent>("拒绝一个份额后刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<RejectShareIncreasedEvent>("拒绝一个份额后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         ResetIfMainCoinSwitched();
                         int index = message.Source.Gpu.Index;
@@ -113,8 +113,8 @@ namespace NTMiner {
                         if (gpuSpeedVm != null) {
                             gpuSpeedVm.MainCoinSpeed.RejectShare = message.Source.MainCoinSpeed.RejectShare;
                         }
-                    }, location: this.GetType());
-                BuildEventPath<IncorrectShareIncreasedEvent>("产生一个错误份额后刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<IncorrectShareIncreasedEvent>("产生一个错误份额后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         ResetIfMainCoinSwitched();
                         int index = message.Source.Gpu.Index;
@@ -122,8 +122,8 @@ namespace NTMiner {
                         if (gpuSpeedVm != null) {
                             gpuSpeedVm.MainCoinSpeed.IncorrectShare = message.Source.MainCoinSpeed.IncorrectShare;
                         }
-                    }, location: this.GetType());
-                BuildEventPath<GpuSpeedChangedEvent>("显卡算力变更后刷新VM内存", LogEnum.None,
+                    });
+                BuildEventPath<GpuSpeedChangedEvent>("显卡算力变更后刷新VM内存", LogEnum.None, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         ResetIfMainCoinSwitched();
                         int index = message.Source.Gpu.Index;
@@ -165,12 +165,12 @@ namespace NTMiner {
                                 }
                             }
                         }
-                    }, location: this.GetType());
-                BuildEventPath<Per1SecondEvent>("每秒钟更新算力活动时间", LogEnum.None,
+                    });
+                BuildEventPath<Per1SecondEvent>("每秒钟更新算力活动时间", LogEnum.None, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         TotalSpeedVm.MainCoinSpeed.OnPropertyChanged(nameof(SpeedViewModel.LastSpeedOnText));
                         TotalSpeedVm.DualCoinSpeed.OnPropertyChanged(nameof(SpeedViewModel.LastSpeedOnText));
-                    }, location: this.GetType());
+                    });
             }
 
             public void Refresh() {

+ 8 - 8
src/AppModels/AppRoot.partials.GpuViewModels.cs

@@ -31,27 +31,27 @@ namespace NTMiner {
                 else {
                     _gpuAllVm = new GpuViewModel(Gpu.GpuAll);
                 }
-                BuildEventPath<EPriceChangedEvent>("电价变更后更新电费显示", LogEnum.DevConsole,
+                BuildEventPath<EPriceChangedEvent>("电价变更后更新电费显示", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         foreach (var gpuVm in _gpuVms.Values) {
                             gpuVm.OnPropertyChanged(nameof(GpuViewModel.EChargeText));
                         }
                         GpuSpeedVms.OnPropertyChanged(nameof(GpuSpeedViewModels.ProfitCnyPerDayText));
-                    }, location: this.GetType());
-                BuildEventPath<MaxTempChangedEvent>("高温红色阈值变更后更新显卡温度颜色", LogEnum.DevConsole,
+                    });
+                BuildEventPath<MaxTempChangedEvent>("高温红色阈值变更后更新显卡温度颜色", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         foreach (var gpuVm in _gpuVms.Values) {
                             gpuVm.OnPropertyChanged(nameof(GpuViewModel.TemperatureForeground));
                         }
-                    }, location: this.GetType());
-                BuildEventPath<PowerAppendChangedEvent>("功耗补偿变更后更新功耗显示", LogEnum.DevConsole,
+                    });
+                BuildEventPath<PowerAppendChangedEvent>("功耗补偿变更后更新功耗显示", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         foreach (var gpuVm in _gpuVms.Values) {
                             gpuVm.OnPropertyChanged(nameof(GpuViewModel.PowerUsageWText));
                         }
                         GpuSpeedVms.OnPropertyChanged(nameof(GpuSpeedViewModels.ProfitCnyPerDayText));
-                    }, location: this.GetType());
-                BuildEventPath<GpuStateChangedEvent>("显卡状态变更后刷新VM内存", LogEnum.None,
+                    });
+                BuildEventPath<GpuStateChangedEvent>("显卡状态变更后刷新VM内存", LogEnum.None, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_gpuVms.ContainsKey(message.Source.Index)) {
                             GpuViewModel vm = _gpuVms[message.Source.Index];
@@ -98,7 +98,7 @@ namespace NTMiner {
                             }
                             UpdateMinMax();
                         }
-                    }, location: this.GetType());
+                    });
             }
 
             private void UpdateMinMax() {

+ 10 - 10
src/AppModels/AppRoot.partials.GroupViewModels.cs

@@ -19,24 +19,24 @@ namespace NTMiner {
                         SortNumber = Count + 1
                     }.Edit.Execute(FormType.Add);
                 });
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         OnPropertyChangeds();
-                    }, location: this.GetType());
-                BuildEventPath<GroupAddedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<GroupAddedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             GroupViewModel groupVm = new GroupViewModel(message.Source);
                             _dicById.Add(message.Source.GetId(), groupVm);
                             OnPropertyChangeds();
                         }
-                    }, location: this.GetType());
-                BuildEventPath<GroupUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<GroupUpdatedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out GroupViewModel vm)) {
                             int sortNumber = vm.SortNumber;
@@ -46,12 +46,12 @@ namespace NTMiner {
                                 OnPropertyChanged(nameof(SelectionOptions));
                             }
                         }
-                    }, location: this.GetType());
-                BuildEventPath<GroupRemovedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<GroupRemovedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         _dicById.Remove(message.Source.GetId());
                         OnPropertyChangeds();
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 10 - 10
src/AppModels/AppRoot.partials.KernelInputViewModels.cs

@@ -13,22 +13,22 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         OnPropertyChangeds();
-                    }, location: this.GetType());
-                BuildEventPath<KernelInputAddedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<KernelInputAddedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         var vm = new KernelInputViewModel(message.Source);
                         _dicById.Add(message.Source.GetId(), vm);
                         OnPropertyChangeds();
-                    }, location: this.GetType());
-                BuildEventPath<KernelInputUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<KernelInputUpdatedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out KernelInputViewModel vm)) {
                             if (vm != null) {
@@ -48,14 +48,14 @@ namespace NTMiner {
                                 }
                             }
                         }
-                    }, location: this.GetType());
-                BuildEventPath<KernelInputRemovedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<KernelInputRemovedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicById.ContainsKey(message.Source.GetId())) {
                             _dicById.Remove(message.Source.GetId());
                             OnPropertyChangeds();
                         }
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 9 - 9
src/AppModels/AppRoot.partials.KernelOutputKeywordViewModels.cs

@@ -14,14 +14,14 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                BuildEventPath<KernelOutputKeywordLoadedEvent>("从服务器加载了内核输入关键字后刷新Vm集", LogEnum.DevConsole,
+                BuildEventPath<KernelOutputKeywordLoadedEvent>("从服务器加载了内核输入关键字后刷新Vm集", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         KernelOutputKeywordViewModel[] toRemoves = _dicById.Where(a => a.Value.GetDataLevel() == DataLevel.Global).Select(a => a.Value).ToArray();
                         foreach (var item in toRemoves) {
                             _dicById.Remove(item.Id);
                         }
                         foreach (var kv in _dicByKernelOutputId) {
-                            foreach (var toRemove in toRemoves.Where(a=>a.KernelOutputId == kv.Key)) {
+                            foreach (var toRemove in toRemoves.Where(a => a.KernelOutputId == kv.Key)) {
                                 kv.Value.Remove(toRemove);
                             }
                         }
@@ -43,8 +43,8 @@ namespace NTMiner {
                                 kernelOutputVm.OnPropertyChanged(nameof(kernelOutputVm.KernelOutputKeywords));
                             }
                         }
-                    }, location: this.GetType());
-                BuildEventPath<UserKernelOutputKeywordAddedEvent>("添加了内核输出过滤器后刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<UserKernelOutputKeywordAddedEvent>("添加了内核输出过滤器后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             KernelOutputKeywordViewModel vm = new KernelOutputKeywordViewModel(message.Source);
@@ -57,14 +57,14 @@ namespace NTMiner {
                                 kernelOutputVm.OnPropertyChanged(nameof(kernelOutputVm.KernelOutputKeywords));
                             }
                         }
-                    }, location: this.GetType());
-                BuildEventPath<UserKernelOutputKeywordUpdatedEvent>("更新了内核输出过滤器后刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<UserKernelOutputKeywordUpdatedEvent>("更新了内核输出过滤器后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out KernelOutputKeywordViewModel vm)) {
                             vm.Update(message.Source);
                         }
-                    }, location: this.GetType());
-                BuildEventPath<UserKernelOutputKeywordRemovedEvent>("删除了内核输出过滤器后刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<UserKernelOutputKeywordRemovedEvent>("删除了内核输出过滤器后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out KernelOutputKeywordViewModel vm)) {
                             _dicById.Remove(vm.Id);
@@ -73,7 +73,7 @@ namespace NTMiner {
                                 kernelOutputVm.OnPropertyChanged(nameof(kernelOutputVm.KernelOutputKeywords));
                             }
                         }
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 10 - 10
src/AppModels/AppRoot.partials.KernelOutputTranslaterViewModels.cs

@@ -14,17 +14,17 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
                         _dicByKernelOutputId.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         OnPropertyChanged(nameof(AllKernelOutputTranslaterVms));
-                    }, location: this.GetType());
-                BuildEventPath<KernelOutputTranslaterAddedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<KernelOutputTranslaterAddedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (KernelOutputVms.TryGetKernelOutputVm(message.Source.KernelOutputId, out KernelOutputViewModel kernelOutputVm)) {
                             if (!_dicByKernelOutputId.ContainsKey(message.Source.KernelOutputId)) {
@@ -35,8 +35,8 @@ namespace NTMiner {
                             _dicById.Add(message.Source.GetId(), vm);
                             kernelOutputVm.OnPropertyChanged(nameof(kernelOutputVm.KernelOutputTranslaters));
                         }
-                    }, location: this.GetType());
-                BuildEventPath<KernelOutputTranslaterUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<KernelOutputTranslaterUpdatedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicByKernelOutputId.TryGetValue(message.Source.KernelOutputId, out List<KernelOutputTranslaterViewModel> vms)) {
                             var vm = vms.FirstOrDefault(a => a.Id == message.Source.GetId());
@@ -44,8 +44,8 @@ namespace NTMiner {
                                 vm.Update(message.Source);
                             }
                         }
-                    }, location: this.GetType());
-                BuildEventPath<KernelOutputTranslaterRemovedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<KernelOutputTranslaterRemovedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicByKernelOutputId.ContainsKey(message.Source.KernelOutputId)) {
                             var item = _dicByKernelOutputId[message.Source.KernelOutputId].FirstOrDefault(a => a.Id == message.Source.GetId());
@@ -59,7 +59,7 @@ namespace NTMiner {
                         if (KernelOutputVms.TryGetKernelOutputVm(message.Source.KernelOutputId, out KernelOutputViewModel kernelOutputVm)) {
                             kernelOutputVm.OnPropertyChanged(nameof(kernelOutputVm.KernelOutputTranslaters));
                         }
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 10 - 10
src/AppModels/AppRoot.partials.KernelOutputViewModels.cs

@@ -13,38 +13,38 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         AllPropertyChanged();
-                    }, location: this.GetType());
-                BuildEventPath<KernelOutputAddedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<KernelOutputAddedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         var vm = new KernelOutputViewModel(message.Source);
                         _dicById.Add(message.Source.GetId(), vm);
                         OnPropertyChanged(nameof(AllKernelOutputVms));
                         OnPropertyChanged(nameof(PleaseSelectVms));
-                    }, location: this.GetType());
-                BuildEventPath<KernelOutputUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<KernelOutputUpdatedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out KernelOutputViewModel vm)) {
                             if (vm != null) {
                                 vm.Update(message.Source);
                             }
                         }
-                    }, location: this.GetType());
-                BuildEventPath<KernelOutputRemovedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<KernelOutputRemovedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicById.ContainsKey(message.Source.GetId())) {
                             _dicById.Remove(message.Source.GetId());
                             OnPropertyChanged(nameof(AllKernelOutputVms));
                             OnPropertyChanged(nameof(PleaseSelectVms));
                         }
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 10 - 10
src/AppModels/AppRoot.partials.KernelViewModels.cs

@@ -19,32 +19,32 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         OnPropertyChanged(nameof(AllKernels));
-                    }, location: this.GetType());
-                BuildEventPath<KernelAddedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<KernelAddedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         _dicById.Add(message.Source.GetId(), new KernelViewModel(message.Source));
                         OnPropertyChanged(nameof(AllKernels));
                         foreach (var coinKernelVm in CoinKernelVms.AllCoinKernels.Where(a => a.KernelId == message.Source.GetId())) {
                             coinKernelVm.OnPropertyChanged(nameof(coinKernelVm.IsSupportDualMine));
                         }
-                    }, location: this.GetType());
-                BuildEventPath<KernelRemovedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<KernelRemovedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Remove(message.Source.GetId());
                         OnPropertyChanged(nameof(AllKernels));
                         foreach (var coinKernelVm in CoinKernelVms.AllCoinKernels.Where(a => a.KernelId == message.Source.GetId())) {
                             coinKernelVm.OnPropertyChanged(nameof(coinKernelVm.IsSupportDualMine));
                         }
-                    }, location: this.GetType());
-                BuildEventPath<KernelUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<KernelUpdatedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out KernelViewModel vm)) {
                             PublishStatus publishStatus = vm.PublishState;
@@ -64,7 +64,7 @@ namespace NTMiner {
                                 }
                             }
                         }
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 10 - 10
src/AppModels/AppRoot.partials.PackageViewModels.cs

@@ -13,32 +13,32 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         OnPropertyChanged(nameof(AllPackages));
-                    }, location: this.GetType());
-                BuildEventPath<PackageAddedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<PackageAddedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         _dicById.Add(message.Source.GetId(), new PackageViewModel(message.Source));
                         OnPropertyChanged(nameof(AllPackages));
                         foreach (var item in KernelVms.AllKernels) {
                             item.OnPropertyChanged(nameof(item.IsPackageValid));
                         }
-                    }, location: this.GetType());
-                BuildEventPath<PackageRemovedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<PackageRemovedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Remove(message.Source.GetId());
                         OnPropertyChanged(nameof(AllPackages));
                         foreach (var item in KernelVms.AllKernels) {
                             item.OnPropertyChanged(nameof(item.IsPackageValid));
                         }
-                    }, location: this.GetType());
-                BuildEventPath<PackageUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<PackageUpdatedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out PackageViewModel vm)) {
                             vm.Update(message.Source);
@@ -46,7 +46,7 @@ namespace NTMiner {
                                 item.OnPropertyChanged(nameof(item.IsPackageValid));
                             }
                         }
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 10 - 10
src/AppModels/AppRoot.partials.PoolKernelViewModels.cs

@@ -14,16 +14,16 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         OnPropertyChanged(nameof(AllPoolKernels));
-                    }, location: this.GetType());
-                BuildEventPath<PoolKernelAddedEvent>("刷新矿池内核VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<PoolKernelAddedEvent>("刷新矿池内核VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             if (PoolVms.TryGetPoolVm(message.Source.PoolId, out PoolViewModel poolVm)) {
@@ -31,8 +31,8 @@ namespace NTMiner {
                                 poolVm.OnPropertyChanged(nameof(poolVm.PoolKernels));
                             }
                         }
-                    }, location: this.GetType());
-                BuildEventPath<PoolKernelRemovedEvent>("刷新矿池内核VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<PoolKernelRemovedEvent>("刷新矿池内核VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (_dicById.ContainsKey(message.Source.GetId())) {
                             var vm = _dicById[message.Source.GetId()];
@@ -41,13 +41,13 @@ namespace NTMiner {
                                 poolVm.OnPropertyChanged(nameof(poolVm.PoolKernels));
                             }
                         }
-                    }, location: this.GetType());
-                BuildEventPath<PoolKernelUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<PoolKernelUpdatedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out PoolKernelViewModel vm)) {
                             vm.Update(message.Source);
                         }
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 4 - 4
src/AppModels/AppRoot.partials.PoolProfileViewModels.cs

@@ -12,16 +12,16 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                BuildEventPath<PoolProfilePropertyChangedEvent>("刷新VM内存", LogEnum.DevConsole,
+                BuildEventPath<PoolProfilePropertyChangedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicById.TryGetValue(message.PoolId, out PoolProfileViewModel vm)) {
                             vm.OnPropertyChanged(message.PropertyName);
                         }
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
-                    }, location: this.GetType());
+                    });
             }
 
             private readonly object _locker = new object();

+ 10 - 10
src/AppModels/AppRoot.partials.PoolViewModels.cs

@@ -12,16 +12,16 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         OnPropertyChanged(nameof(AllPools));
-                    }, location: this.GetType());
-                BuildEventPath<PoolAddedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<PoolAddedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         _dicById.Add(message.Source.GetId(), new PoolViewModel(message.Source));
                         OnPropertyChanged(nameof(AllPools));
@@ -31,8 +31,8 @@ namespace NTMiner {
                             coinVm.OnPropertyChanged(nameof(CoinViewModel.Pools));
                             coinVm.OnPropertyChanged(nameof(CoinViewModel.OptionPools));
                         }
-                    }, location: this.GetType());
-                BuildEventPath<PoolRemovedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<PoolRemovedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         _dicById.Remove(message.Source.GetId());
                         OnPropertyChanged(nameof(AllPools));
@@ -42,13 +42,13 @@ namespace NTMiner {
                             coinVm.OnPropertyChanged(nameof(CoinViewModel.Pools));
                             coinVm.OnPropertyChanged(nameof(CoinViewModel.OptionPools));
                         }
-                    }, location: this.GetType());
-                BuildEventPath<PoolUpdatedEvent>("刷新VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<PoolUpdatedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out PoolViewModel vm)) {
                             vm.Update(message.Source);
                         }
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 2 - 2
src/AppModels/AppRoot.partials.ShareViewModels.cs

@@ -12,12 +12,12 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                BuildEventPath<ShareChangedEvent>("收益变更后调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<ShareChangedEvent>("收益变更后调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicByCoinId.TryGetValue(message.Source.CoinId, out ShareViewModel shareVm)) {
                             shareVm.Update(message.Source);
                         }
-                    }, location: this.GetType());
+                    });
             }
 
             private readonly object _locker = new object();

+ 10 - 10
src/AppModels/AppRoot.partials.SysDicItemViewModels.cs

@@ -13,16 +13,16 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         AllPropertyChanged();
-                    }, location: this.GetType());
-                BuildEventPath<SysDicItemAddedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<SysDicItemAddedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             _dicById.Add(message.Source.GetId(), new SysDicItemViewModel(message.Source));
@@ -32,8 +32,8 @@ namespace NTMiner {
                                 sysDicVm.OnPropertyChanged(nameof(sysDicVm.SysDicItemsSelect));
                             }
                         }
-                    }, location: this.GetType());
-                BuildEventPath<SysDicItemUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<SysDicItemUpdatedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out SysDicItemViewModel vm)) {
                             int sortNumber = vm.SortNumber;
@@ -45,8 +45,8 @@ namespace NTMiner {
                                 }
                             }
                         }
-                    }, location: this.GetType());
-                BuildEventPath<SysDicItemRemovedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<SysDicItemRemovedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         _dicById.Remove(message.Source.GetId());
                         AllPropertyChanged();
@@ -54,7 +54,7 @@ namespace NTMiner {
                             sysDicVm.OnPropertyChanged(nameof(sysDicVm.SysDicItems));
                             sysDicVm.OnPropertyChanged(nameof(sysDicVm.SysDicItemsSelect));
                         }
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 10 - 10
src/AppModels/AppRoot.partials.SysDicViewModels.cs

@@ -16,20 +16,20 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<ServerContextReInitedEvent>("刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicByCode.Clear();
                         _dicById.Clear();
                         Init();
-                    }, location: this.GetType());
-                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole,
+                    });
+                VirtualRoot.BuildEventPath<ServerContextReInitedEventHandledEvent>("刷新视图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         OnPropertyChangeds();
-                    }, location: this.GetType());
+                    });
                 this.Add = new DelegateCommand(() => {
                     new SysDicViewModel(Guid.NewGuid()).Edit.Execute(null);
                 });
-                BuildEventPath<SysDicAddedEvent>("调整VM内存", LogEnum.DevConsole,
+                BuildEventPath<SysDicAddedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             SysDicViewModel sysDicVm = new SysDicViewModel(message.Source);
@@ -39,8 +39,8 @@ namespace NTMiner {
                             }
                             OnPropertyChangeds();
                         }
-                    }, location: this.GetType());
-                BuildEventPath<SysDicUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<SysDicUpdatedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out SysDicViewModel vm)) {
                             int sortNumber = vm.SortNumber;
@@ -49,13 +49,13 @@ namespace NTMiner {
                                 this.OnPropertyChanged(nameof(List));
                             }
                         }
-                    }, location: this.GetType());
-                BuildEventPath<SysDicRemovedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<SysDicRemovedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         _dicById.Remove(message.Source.GetId());
                         _dicByCode.Remove(message.Source.Code);
                         OnPropertyChangeds();
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 9 - 9
src/AppModels/AppRoot.partials.WalletViewModels.cs

@@ -12,12 +12,12 @@ namespace NTMiner {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("刷新钱包Vm内存", LogEnum.None,
-                    path: message=> {
+                VirtualRoot.BuildEventPath<LocalContextReInitedEvent>("刷新钱包Vm内存", LogEnum.None, location: this.GetType(), PathPriority.Normal,
+                    path: message => {
                         _dicById.Clear();
                         Init();
-                    }, location: this.GetType());
-                BuildEventPath<WalletAddedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<WalletAddedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         _dicById.Add(message.Source.GetId(), new WalletViewModel(message.Source));
                         OnPropertyChanged(nameof(WalletList));
@@ -27,8 +27,8 @@ namespace NTMiner {
                             coin.CoinKernel?.CoinKernelProfile?.SelectedDualCoin?.OnPropertyChanged(nameof(CoinViewModel.Wallets));
                         }
                         VirtualRoot.RaiseEvent(new WalletVmAddedEvent(message));
-                    }, location: this.GetType());
-                BuildEventPath<WalletRemovedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<WalletRemovedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         _dicById.Remove(message.Source.GetId());
                         OnPropertyChanged(nameof(WalletList));
@@ -39,13 +39,13 @@ namespace NTMiner {
                             coin.CoinKernel?.CoinKernelProfile?.SelectedDualCoin?.OnPropertyChanged(nameof(CoinViewModel.Wallets));
                         }
                         VirtualRoot.RaiseEvent(new WalletVmRemovedEvent(message));
-                    }, location: this.GetType());
-                BuildEventPath<WalletUpdatedEvent>("调整VM内存", LogEnum.DevConsole,
+                    });
+                BuildEventPath<WalletUpdatedEvent>("调整VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out WalletViewModel vm)) {
                             vm.Update(message.Source);
                         }
-                    }, location: this.GetType());
+                    });
                 Init();
             }
 

+ 2 - 2
src/AppModels/ExtendedNotifyIcon.cs

@@ -38,9 +38,9 @@ namespace NTMiner {
                     VirtualRoot.Execute(new ShowMainWindowCommand(isToggle: true));
                 }
             };
-            VirtualRoot.BuildEventPath<AppExitEvent>("退出托盘图标", LogEnum.None, path: message => {
+            VirtualRoot.BuildEventPath<AppExitEvent>("退出托盘图标", LogEnum.None, typeof(ExtendedNotifyIcon), PathPriority.Normal, path: message => {
                 _targetNotifyIcon.Dispose();
-            }, typeof(ExtendedNotifyIcon));
+            });
         }
 
         public void RefreshIcon() {

+ 4 - 4
src/AppModels/MinerStudio/MinerStudioRoot.partials.ColumnsShowViewModels.cs

@@ -45,7 +45,7 @@ namespace NTMiner.MinerStudio {
                         NTMinerContext.MinerStudioContext.ColumnsShowSet.AddOrUpdate(entity);
                     });
                 });
-                AppRoot.BuildEventPath<ColumnsShowAddedOrUpdatedEvent>("添加或修改了列分组后刷新VM内存", LogEnum.DevConsole,
+                AppRoot.BuildEventPath<ColumnsShowAddedOrUpdatedEvent>("添加或修改了列分组后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (!_dicById.TryGetValue(message.Source.GetId(), out ColumnsShowViewModel vm)) {
                             vm = new ColumnsShowViewModel(message.Source);
@@ -56,8 +56,8 @@ namespace NTMiner.MinerStudio {
                         else {
                             vm.Update(message.Source);
                         }
-                    }, location: this.GetType());
-                AppRoot.BuildEventPath<ColumnsRemovedEvent>("删除了列分组后刷新Vm内存", LogEnum.DevConsole, path: message => {
+                    });
+                AppRoot.BuildEventPath<ColumnsRemovedEvent>("删除了列分组后刷新Vm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     if (_dicById.ContainsKey(message.Source.Id)) {
                         _dicById.Remove(message.Source.Id);
                         OnPropertyChanged(nameof(List));
@@ -65,7 +65,7 @@ namespace NTMiner.MinerStudio {
                             MinerClientsWindowVm.ColumnsShow = vm;
                         }
                     }
-                }, this.GetType());
+                });
 
                 foreach (var item in NTMinerContext.MinerStudioContext.ColumnsShowSet.GetAll()) {
                     _dicById.Add(item.Id, new ColumnsShowViewModel(item));

+ 8 - 8
src/AppModels/MinerStudio/MinerStudioRoot.partials.MineWorkViewModels.cs

@@ -22,7 +22,7 @@ namespace NTMiner.MinerStudio {
                         _dicById.Add(item.Id, new MineWorkViewModel(item));
                     }
                 }
-                AppRoot.BuildEventPath<MineWorkSetInitedEvent>("作业集初始化后初始化Vm内存", LogEnum.DevConsole, path: message => {
+                AppRoot.BuildEventPath<MineWorkSetInitedEvent>("作业集初始化后初始化Vm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     _dicById.Clear();
                     foreach (var item in NTMinerContext.MinerStudioContext.MineWorkSet.AsEnumerable().ToArray()) {
                         if (!_dicById.ContainsKey(item.Id)) {
@@ -31,11 +31,11 @@ namespace NTMiner.MinerStudio {
                     }
                     OnPropertyChangeds();
                     MinerClientsWindowViewModel.Instance.RefreshMinerClientsSelectedMineWork(MinerClientsWindowViewModel.Instance.MinerClients.ToArray());
-                }, this.GetType());
+                });
                 this.Add = new DelegateCommand(() => {
                     new MineWorkViewModel(Guid.NewGuid()).Edit.Execute(FormType.Add);
                 });
-                AppRoot.BuildEventPath<MineWorkAddedEvent>("添加作业后刷新VM内存", LogEnum.DevConsole,
+                AppRoot.BuildEventPath<MineWorkAddedEvent>("添加作业后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (!_dicById.TryGetValue(message.Source.GetId(), out MineWorkViewModel vm)) {
                             vm = new MineWorkViewModel(message.Source);
@@ -45,14 +45,14 @@ namespace NTMiner.MinerStudio {
                                 MinerClientsWindowVm.SelectedMineWork = MineWorkViewModel.PleaseSelect;
                             }
                         }
-                    }, location: this.GetType());
-                AppRoot.BuildEventPath<MineWorkUpdatedEvent>("添加作业后刷新VM内存", LogEnum.DevConsole,
+                    });
+                AppRoot.BuildEventPath<MineWorkUpdatedEvent>("添加作业后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out MineWorkViewModel vm)) {
                             vm.Update(message.Source);
                         }
-                    }, location: this.GetType());
-                AppRoot.BuildEventPath<MineWorkRemovedEvent>("移除了作业后刷新Vm内存", LogEnum.DevConsole, path: message => {
+                    });
+                AppRoot.BuildEventPath<MineWorkRemovedEvent>("移除了作业后刷新Vm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     if (_dicById.TryGetValue(message.Source.Id, out MineWorkViewModel vm)) {
                         _dicById.Remove(vm.Id);
                         OnPropertyChangeds();
@@ -60,7 +60,7 @@ namespace NTMiner.MinerStudio {
                             MinerClientsWindowVm.SelectedMineWork = MineWorkViewModel.PleaseSelect;
                         }
                     }
-                }, this.GetType());
+                });
             }
 
             private void OnPropertyChangeds() {

+ 8 - 8
src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerClientConsoleViewModel.cs

@@ -35,7 +35,7 @@ namespace NTMiner.MinerStudio {
 
             public MinerClientConsoleViewModel() {
                 if (ClientAppType.IsMinerStudio) {
-                    VirtualRoot.BuildEventPath<MinerClientSelectionChangedEvent>("刷新矿机控制台输出", LogEnum.DevConsole, path: message => {
+                    VirtualRoot.BuildEventPath<MinerClientSelectionChangedEvent>("刷新矿机控制台输出", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                         bool isChanged = true;
                         if (message.MinerClientVm != null && this._minerClientVm != null && this._minerClientVm.ClientId == message.MinerClientVm.ClientId) {
                             isChanged = false;
@@ -53,8 +53,8 @@ namespace NTMiner.MinerStudio {
                             }
                             SendGetConsoleOutLinesMqMessage(isFast: true);
                         }
-                    }, this.GetType());
-                    VirtualRoot.BuildEventPath<ClientConsoleOutLinesEvent>("将收到的挖矿端控制台消息输出到输出窗口", LogEnum.DevConsole, path: message => {
+                    });
+                    VirtualRoot.BuildEventPath<ClientConsoleOutLinesEvent>("将收到的挖矿端控制台消息输出到输出窗口", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                         if (this._minerClientVm == null
                             || this._minerClientVm.ClientId != message.ClientId
                             || message.Data == null
@@ -69,16 +69,16 @@ namespace NTMiner.MinerStudio {
                             // 因为客户端的时间可能不准所以不能使用客户端的时间
                             LatestTimestamp = DateTime.Now;
                         }
-                    }, this.GetType());
-                    VirtualRoot.BuildEventPath<Per5SecondEvent>("周期获取当前选中的那台矿机的控制台输出", LogEnum.DevConsole, path: message => {
+                    });
+                    VirtualRoot.BuildEventPath<Per5SecondEvent>("周期获取当前选中的那台矿机的控制台输出", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                         SendGetConsoleOutLinesMqMessage(isFast: false);
-                    }, this.GetType());
-                    VirtualRoot.BuildEventPath<Per1SecondEvent>("客户端控制台输出倒计时秒表", LogEnum.None, path: message => {
+                    });
+                    VirtualRoot.BuildEventPath<Per1SecondEvent>("客户端控制台输出倒计时秒表", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
                         if (this._minerClientVm == null || this._latestTimestamp == Timestamp.UnixBaseTime) {
                             return;
                         }
                         OnPropertyChanged(nameof(LatestTimeSpanText));
-                    }, this.GetType());
+                    });
                 }
             }
 

+ 7 - 7
src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerClientMessagesViewModel.cs

@@ -7,7 +7,7 @@ using System.Linq;
 namespace NTMiner.MinerStudio {
     public static partial class MinerStudioRoot {
         public class MinerClientMessagesViewModel : ViewModelBase {
-            private ObservableCollection<LocalMessageDtoViewModel> _vms = new ObservableCollection<LocalMessageDtoViewModel>();
+            private readonly ObservableCollection<LocalMessageDtoViewModel> _vms = new ObservableCollection<LocalMessageDtoViewModel>();
             private readonly object _locker = new object();
             private MinerClientViewModel _minerClientVm;
 
@@ -22,7 +22,7 @@ namespace NTMiner.MinerStudio {
                     return;
                 }
                 if (ClientAppType.IsMinerStudio) {
-                    VirtualRoot.BuildEventPath<MinerClientSelectionChangedEvent>("刷新矿机消息列表", LogEnum.DevConsole, path: message => {
+                    VirtualRoot.BuildEventPath<MinerClientSelectionChangedEvent>("刷新矿机消息列表", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                         bool isChanged = true;
                         if (message.MinerClientVm != null && this._minerClientVm != null && this._minerClientVm.ClientId == message.MinerClientVm.ClientId) {
                             isChanged = false;
@@ -35,8 +35,8 @@ namespace NTMiner.MinerStudio {
                             }
                             SendGetLocalMessagesMqMessage(isFast: true);
                         }
-                    }, this.GetType());
-                    VirtualRoot.BuildEventPath<ClientLocalMessagesEvent>("将收到的挖矿端本地消息展示到消息列表", LogEnum.DevConsole,
+                    });
+                    VirtualRoot.BuildEventPath<ClientLocalMessagesEvent>("将收到的挖矿端本地消息展示到消息列表", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                         path: message => {
                             if (this._minerClientVm == null || this._minerClientVm.ClientId != message.ClientId) {
                                 return;
@@ -50,10 +50,10 @@ namespace NTMiner.MinerStudio {
                                 }
                                 OnPropertyChanged(nameof(IsNoRecord));
                             });
-                        }, location: this.GetType());
-                    VirtualRoot.BuildEventPath<Per5SecondEvent>("周期获取当前选中的那台矿机的本地消息", LogEnum.DevConsole, path: message => {
+                        });
+                    VirtualRoot.BuildEventPath<Per5SecondEvent>("周期获取当前选中的那台矿机的本地消息", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                         SendGetLocalMessagesMqMessage(isFast: false);
-                    }, this.GetType());
+                    });
                 }
             }
 

+ 8 - 8
src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerClientOperationResultsViewModel.cs

@@ -26,7 +26,7 @@ namespace NTMiner.MinerStudio {
                     return;
                 }
                 if (ClientAppType.IsMinerStudio) {
-                    VirtualRoot.BuildEventPath<MinerClientSelectionChangedEvent>("刷新矿机本地群控响应消息列表", LogEnum.DevConsole, path: message => {
+                    VirtualRoot.BuildEventPath<MinerClientSelectionChangedEvent>("刷新矿机本地群控响应消息列表", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                         bool isChanged = true;
                         if (message.MinerClientVm != null && this._minerClientVm != null && this._minerClientVm.ClientId == message.MinerClientVm.ClientId) {
                             isChanged = false;
@@ -45,8 +45,8 @@ namespace NTMiner.MinerStudio {
                             }
                             SendGetOperationResultsMqMessage(isFast: true);
                         }
-                    }, this.GetType());
-                    VirtualRoot.BuildEventPath<ClientOperationResultsEvent>("将收到的挖矿端本地群控响应消息刷到展示层", LogEnum.DevConsole,
+                    });
+                    VirtualRoot.BuildEventPath<ClientOperationResultsEvent>("将收到的挖矿端本地群控响应消息刷到展示层", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                         path: message => {
                             if (this._minerClientVm == null || this._minerClientVm.ClientId != message.ClientId) {
                                 return;
@@ -62,16 +62,16 @@ namespace NTMiner.MinerStudio {
                                 }
                                 OnPropertyChanged(nameof(IsNoRecord));
                             });
-                        }, location: this.GetType());
-                    VirtualRoot.BuildEventPath<ClientOperationReceivedEvent>("收到了挖矿端群控响应了群控操作的通知", LogEnum.DevConsole,
+                        });
+                    VirtualRoot.BuildEventPath<ClientOperationReceivedEvent>("收到了挖矿端群控响应了群控操作的通知", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                         path: message => {
                             if (_minerClientVm != null && _minerClientVm.ClientId == message.ClientId) {
                                 SendGetOperationResultsMqMessage(isFast: true);
                             }
-                        }, location: this.GetType());
-                    VirtualRoot.BuildEventPath<Per5SecondEvent>("周期获取当前选中的那台矿机的本地群控响应消息", LogEnum.DevConsole, path: message => {
+                        });
+                    VirtualRoot.BuildEventPath<Per5SecondEvent>("周期获取当前选中的那台矿机的本地群控响应消息", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                         SendGetOperationResultsMqMessage(isFast: false);
-                    }, this.GetType());
+                    });
                 }
             }
 

+ 8 - 8
src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerGroupViewModels.cs

@@ -22,7 +22,7 @@ namespace NTMiner.MinerStudio {
                         _dicById.Add(item.Id, new MinerGroupViewModel(item));
                     }
                 }
-                AppRoot.BuildEventPath<MinerGroupSetInitedEvent>("矿工组集初始化后初始化Vm内存", LogEnum.DevConsole, path: message => {
+                AppRoot.BuildEventPath<MinerGroupSetInitedEvent>("矿工组集初始化后初始化Vm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     _dicById.Clear();
                     foreach (var item in NTMinerContext.MinerStudioContext.MinerGroupSet.AsEnumerable().ToArray()) {
                         if (!_dicById.ContainsKey(item.Id)) {
@@ -31,11 +31,11 @@ namespace NTMiner.MinerStudio {
                     }
                     this.OnPropertyChangeds();
                     MinerClientsWindowViewModel.Instance.RefreshMinerClientsSelectedMinerGroup(MinerClientsWindowViewModel.Instance.MinerClients.ToArray());
-                }, this.GetType());
+                });
                 this.Add = new DelegateCommand(() => {
                     new MinerGroupViewModel(Guid.NewGuid()).Edit.Execute(FormType.Add);
                 });
-                AppRoot.BuildEventPath<MinerGroupAddedEvent>("添加矿机分组后刷新VM内存", LogEnum.DevConsole,
+                AppRoot.BuildEventPath<MinerGroupAddedEvent>("添加矿机分组后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (!_dicById.TryGetValue(message.Source.GetId(), out MinerGroupViewModel vm)) {
                             vm = new MinerGroupViewModel(message.Source);
@@ -43,20 +43,20 @@ namespace NTMiner.MinerStudio {
                             OnPropertyChangeds();
                             MinerClientsWindowVm.OnPropertyChanged(nameof(MinerClientsWindowViewModel.SelectedMinerGroup));
                         }
-                    }, location: this.GetType());
-                AppRoot.BuildEventPath<MinerGroupUpdatedEvent>("添加矿机分组后刷新VM内存", LogEnum.DevConsole,
+                    });
+                AppRoot.BuildEventPath<MinerGroupUpdatedEvent>("添加矿机分组后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out MinerGroupViewModel vm)) {
                             vm.Update(message.Source);
                         }
-                    }, location: this.GetType());
-                AppRoot.BuildEventPath<MinerGroupRemovedEvent>("移除了矿机组后刷新Vm内容", LogEnum.DevConsole, path: message => {
+                    });
+                AppRoot.BuildEventPath<MinerGroupRemovedEvent>("移除了矿机组后刷新Vm内容", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     if (_dicById.TryGetValue(message.Source.Id, out MinerGroupViewModel vm)) {
                         _dicById.Remove(vm.Id);
                         OnPropertyChangeds();
                         MinerClientsWindowVm.OnPropertyChanged(nameof(MinerClientsWindowViewModel.SelectedMinerGroup));
                     }
-                }, this.GetType());
+                });
             }
 
             private void OnPropertyChangeds() {

+ 8 - 8
src/AppModels/MinerStudio/MinerStudioRoot.partials.NTMinerWalletViewModels.cs

@@ -18,14 +18,14 @@ namespace NTMiner.MinerStudio {
                     return;
                 }
                 Init(refresh: false);
-                AppRoot.BuildEventPath<NTMinerWalletSetInitedEvent>("NTMiner钱包集初始化后", LogEnum.DevConsole,
+                AppRoot.BuildEventPath<NTMinerWalletSetInitedEvent>("NTMiner钱包集初始化后", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         Init(refresh: true);
-                    }, location: this.GetType());
+                    });
                 this.Add = new DelegateCommand(() => {
                     new NTMinerWalletViewModel(Guid.NewGuid()).Edit.Execute(FormType.Add);
                 });
-                AppRoot.BuildEventPath<NTMinerWalletAddedEvent>("添加NTMiner钱包后刷新VM内存", LogEnum.DevConsole,
+                AppRoot.BuildEventPath<NTMinerWalletAddedEvent>("添加NTMiner钱包后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             _dicById.Add(message.Source.GetId(), new NTMinerWalletViewModel(message.Source));
@@ -33,20 +33,20 @@ namespace NTMiner.MinerStudio {
                                 coinVm.OnPropertyChanged(nameof(coinVm.NTMinerWallets));
                             }
                         }
-                    }, location: this.GetType());
-                AppRoot.BuildEventPath<NTMinerWalletUpdatedEvent>("更新NTMiner钱包后刷新VM内存", LogEnum.DevConsole,
+                    });
+                AppRoot.BuildEventPath<NTMinerWalletUpdatedEvent>("更新NTMiner钱包后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out NTMinerWalletViewModel vm)) {
                             vm.Update(message.Source);
                         }
-                    }, location: this.GetType());
-                AppRoot.BuildEventPath<NTMinerWalletRemovedEvent>("删除NTMiner钱包后刷新VM内存", LogEnum.DevConsole,
+                    });
+                AppRoot.BuildEventPath<NTMinerWalletRemovedEvent>("删除NTMiner钱包后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Remove(message.Source.GetId());
                         if (AppRoot.CoinVms.TryGetCoinVm(message.Source.CoinCode, out CoinViewModel coinVm)) {
                             coinVm.OnPropertyChanged(nameof(coinVm.NTMinerWallets));
                         }
-                    }, location: this.GetType());
+                    });
             }
 
             private void Init(bool refresh) {

+ 8 - 8
src/AppModels/MinerStudio/MinerStudioRoot.partials.OverClockDataViewModels.cs

@@ -15,11 +15,11 @@ namespace NTMiner.MinerStudio {
                     return;
                 }
                 Init(refresh: false);
-                AppRoot.BuildEventPath<OverClockDataSetInitedEvent>("超频菜谱集初始化后", LogEnum.DevConsole,
+                AppRoot.BuildEventPath<OverClockDataSetInitedEvent>("超频菜谱集初始化后", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         Init(refresh: true);
-                    }, location: this.GetType());
-                AppRoot.BuildEventPath<OverClockDataAddedEvent>("添加超频菜谱后刷新VM内存", LogEnum.DevConsole,
+                    });
+                AppRoot.BuildEventPath<OverClockDataAddedEvent>("添加超频菜谱后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (!_dicById.ContainsKey(message.Source.GetId())) {
                             _dicById.Add(message.Source.GetId(), new OverClockDataViewModel(message.Source));
@@ -27,20 +27,20 @@ namespace NTMiner.MinerStudio {
                                 coinVm.OnPropertyChanged(nameof(coinVm.OverClockDatas));
                             }
                         }
-                    }, location: this.GetType());
-                AppRoot.BuildEventPath<OverClockDataUpdatedEvent>("更新超频菜谱后刷新VM内存", LogEnum.DevConsole,
+                    });
+                AppRoot.BuildEventPath<OverClockDataUpdatedEvent>("更新超频菜谱后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (_dicById.TryGetValue(message.Source.GetId(), out OverClockDataViewModel vm)) {
                             vm.Update(message.Source);
                         }
-                    }, location: this.GetType());
-                AppRoot.BuildEventPath<OverClockDataRemovedEvent>("删除超频菜谱后刷新VM内存", LogEnum.DevConsole,
+                    });
+                AppRoot.BuildEventPath<OverClockDataRemovedEvent>("删除超频菜谱后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         _dicById.Remove(message.Source.GetId());
                         if (AppRoot.CoinVms.TryGetCoinVm(message.Source.CoinId, out CoinViewModel coinVm)) {
                             coinVm.OnPropertyChanged(nameof(coinVm.OverClockDatas));
                         }
-                    }, location: this.GetType());
+                    });
             }
 
             private void Init(bool refresh) {

+ 2 - 2
src/AppModels/MinerStudio/Vms/MineWorkViewModel.cs

@@ -104,12 +104,12 @@ namespace NTMiner.MinerStudio.Vms {
                             VirtualRoot.Out.ShowError("无法操作,因为选中的矿机未开启外网群控。", autoHideSeconds: 6);
                             return;
                         }
-                        VirtualRoot.BuildOnecePath<GetSelfWorkLocalJsonResponsedEvent>("填充Vm内存", LogEnum.DevConsole, path: message => {
+                        VirtualRoot.BuildOnecePath<GetSelfWorkLocalJsonResponsedEvent>("填充Vm内存", LogEnum.DevConsole, PathId.Empty, typeof(MineWorkViewModel), PathPriority.Normal, path: message => {
                             if (message.ClientId == _minerClientVm.ClientId) {
                                 string data = message.Data;
                                 EditJson(formType, WorkType.SelfWork, data);
                             }
-                        }, PathId.Empty, typeof(MineWorkViewModel));
+                        });
                         MinerStudioRoot.MinerStudioService.GetSelfWorkLocalJsonAsync(_minerClientVm);
                     }
                     else {

+ 10 - 10
src/AppModels/MinerStudio/Vms/MinerClientsWindowViewModel.cs

@@ -242,7 +242,7 @@ namespace NTMiner.MinerStudio.Vms {
         }
 
         private void AddEventPath() {
-            VirtualRoot.BuildEventPath<QueryClientsResponseEvent>("收到QueryClientsResponse响应后刷新界面", LogEnum.DevConsole, path: message => {
+            VirtualRoot.BuildEventPath<QueryClientsResponseEvent>("收到QueryClientsResponse响应后刷新界面", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                 this.ResetCountDown();
                 this.IsLoading = false;
                 var response = message.Response;
@@ -354,7 +354,7 @@ namespace NTMiner.MinerStudio.Vms {
                     }
                     #endregion
                 }
-            }, this.GetType());
+            });
         }
         #endregion
 
@@ -865,7 +865,7 @@ namespace NTMiner.MinerStudio.Vms {
                     RpcRoot.SetIsOuterNet(false);
                 }
             });
-            VirtualRoot.BuildEventPath<MinerStudioServiceSwitchedEvent>("切换了群控后台客户端服务类型后刷新矿机列表", LogEnum.DevConsole, path: message => {
+            VirtualRoot.BuildEventPath<MinerStudioServiceSwitchedEvent>("切换了群控后台客户端服务类型后刷新矿机列表", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                 this.OnPropertyChanged(nameof(NetTypeToolTip));
                 this.OnPropertyChanged(nameof(NetTypeText));
                 if (message.ServiceType == MinerStudioServiceType.Out) {
@@ -880,14 +880,14 @@ namespace NTMiner.MinerStudio.Vms {
                 else {
                     this.QueryMinerClients();
                 }
-            }, this.GetType());
-            VirtualRoot.BuildCmdPath<UpdateMinerClientVmCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<UpdateMinerClientVmCommand>(this.GetType(), LogEnum.DevConsole, path: message => {
                 var vm = _minerClients.FirstOrDefault(a => a.Id == message.ClientData.Id);
                 if (vm != null) {
                     vm.Update(message.ClientData);
                 }
-            }, this.GetType(), LogEnum.DevConsole);
-            VirtualRoot.BuildCmdPath<RefreshWsStateCommand>(message => {
+            });
+            VirtualRoot.BuildCmdPath<RefreshWsStateCommand>(this.GetType(), LogEnum.DevConsole, message => {
                 #region
                 if (message.WsClientState != null) {
                     this.WsServerIp = message.WsClientState.WsServerIp;
@@ -908,18 +908,18 @@ namespace NTMiner.MinerStudio.Vms {
                     }
                 }
                 #endregion
-            }, this.GetType(), LogEnum.DevConsole);
+            });
             if (RpcRoot.IsOuterNet) {
                 VirtualRoot.Execute(new RefreshWsStateCommand(MinerStudioRoot.WsClient.GetState()));
             }
-            VirtualRoot.BuildEventPath<Per1SecondEvent>("外网群控重试秒表倒计时", LogEnum.None, path: message => {
+            VirtualRoot.BuildEventPath<Per1SecondEvent>("外网群控重试秒表倒计时", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
                 if (!IsWsOnline) {
                     if (WsNextTrySecondsDelay > 0) {
                         WsNextTrySecondsDelay--;
                     }
                     OnPropertyChanged(nameof(WsLastTryOnText));
                 }
-            }, this.GetType());
+            });
         }
         #endregion
 

+ 2 - 2
src/AppModels/MinerStudio/Vms/NTMinerFileSelectViewModel.cs

@@ -29,10 +29,10 @@ namespace NTMiner.MinerStudio.Vms {
             for (int i = 0; i < 7; i++) {
                 _ntminerFileVms.Add(NTMinerFileViewModel.Empty);
             }
-            VirtualRoot.BuildEventPath<NTMinerFileSetInitedEvent>("开源矿工程序版本文件集初始化后刷新Vm内存", LogEnum.DevConsole, path: message => {
+            VirtualRoot.BuildEventPath<NTMinerFileSetInitedEvent>("开源矿工程序版本文件集初始化后刷新Vm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                 var ntminerFiles = MinerStudioRoot.ReadOnlyNTMinerFileSet.AsEnumerable().Where(a => a.AppType == NTMinerAppType.MinerClient);
                 NTMinerFileVms = ntminerFiles.OrderByDescending(a => a.GetVersion()).Select(a => new NTMinerFileViewModel(a)).ToList();
-            }, this.GetType());
+            });
             // 触发从远程加载数据的逻辑
             VirtualRoot.Execute(new RefreshNTMinerFileSetCommand());
         }

+ 2 - 2
src/AppModels/View/AbstractAppViewFactory.cs

@@ -8,7 +8,7 @@ namespace NTMiner.View {
         private static Window _mainWindow = null;
 
         public AbstractAppViewFactory() {
-            VirtualRoot.BuildCmdPath<CloseNTMinerCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<CloseNTMinerCommand>(location: typeof(AbstractAppViewFactory), LogEnum.DevConsole, path: message => {
                 // 不能推迟这个日志记录的时机,因为推迟会有windows异常日志
                 VirtualRoot.ThisLocalInfo(nameof(AbstractAppViewFactory), $"退出{VirtualRoot.AppName}。原因:{message.Reason}");
                 UIThread.Execute(() => {
@@ -20,7 +20,7 @@ namespace NTMiner.View {
                         Environment.Exit(0);
                     }
                 });
-            }, location: typeof(AbstractAppViewFactory));
+            });
         }
 
         public void ShowMainWindow(bool isToggle, out Window mainWindow) {

+ 2 - 2
src/AppModels/Vms/KernelOutputKeywordsViewModel.cs

@@ -11,10 +11,10 @@ namespace NTMiner.Vms {
             if (WpfUtil.IsInDesignMode) {
                 return;
             }
-            VirtualRoot.BuildEventPath<CurrentMineContextChangedEvent>("挖矿上下文变更后刷新内核输出关键字Vm视图集", LogEnum.DevConsole,
+            VirtualRoot.BuildEventPath<CurrentMineContextChangedEvent>("挖矿上下文变更后刷新内核输出关键字Vm视图集", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     OnPropertyChanged(nameof(KernelOutputVm));
-                }, location: this.GetType());
+                });
             this.Add = new DelegateCommand(() => {
                 KernelOutputViewModel kernelOutputVm = KernelOutputVm;
                 if (kernelOutputVm == null) {

+ 6 - 6
src/AppModels/Vms/LocalMessagesViewModel.cs

@@ -70,11 +70,11 @@
                     VirtualRoot.Execute(new ClearLocalMessageSetCommand());
                 }));
             });
-            VirtualRoot.BuildEventPath<LocalMessageSetClearedEvent>("清空本地消息集后刷新VM内存", LogEnum.DevConsole,
+            VirtualRoot.BuildEventPath<LocalMessageSetClearedEvent>("清空本地消息集后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     Init();
-                }, location: this.GetType());
-            VirtualRoot.BuildEventPath<LocalMessageAddedEvent>("发生了本地消息后刷新Vm内存", LogEnum.DevConsole,
+                });
+            VirtualRoot.BuildEventPath<LocalMessageAddedEvent>("发生了本地消息后刷新Vm内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     UIThread.Execute(() => {
                         var vm = new LocalMessageViewModel(message.Source);
@@ -98,8 +98,8 @@
                         }
                         OnPropertyChanged(nameof(IsNoRecord));
                     });
-                }, location: this.GetType());
-            VirtualRoot.BuildEventPath<NewDayEvent>("新的一天到来时刷新消息集中的可读性时间戳展示", LogEnum.DevConsole,
+                });
+            VirtualRoot.BuildEventPath<NewDayEvent>("新的一天到来时刷新消息集中的可读性时间戳展示", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     if (QueryResults == null) {
                         return;
@@ -113,7 +113,7 @@
                             break;
                         }
                     }
-                }, location: this.GetType());
+                });
         }
 
         private void Init() {

+ 2 - 2
src/AppModels/Vms/MainMenuViewModel.cs

@@ -10,14 +10,14 @@ namespace NTMiner.Vms {
             if (WpfUtil.IsInDesignMode) {
                 return;
             }
-            VirtualRoot.BuildEventPath<MinerStudioServiceSwitchedEvent>("群控后台客户端服务类型切换后刷新菜单的展示状态", LogEnum.DevConsole, path: message => {
+            VirtualRoot.BuildEventPath<MinerStudioServiceSwitchedEvent>("群控后台客户端服务类型切换后刷新菜单的展示状态", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                 this.OnPropertyChanged(nameof(LoginName));
                 this.OnPropertyChanged(nameof(IsMinerStudioLocalOrOuterAdminVisible));
                 this.OnPropertyChanged(nameof(IsMinerStudioOuterAdmin));
                 this.OnPropertyChanged(nameof(IsMinerStudioOuterAdminVisible));
                 this.OnPropertyChanged(nameof(IsMinerStudioOuterVisible));
                 this.OnPropertyChanged(nameof(IsMinerStudioLocalVisible));
-            }, this.GetType());
+            });
         }
 
         public string LoginName {

+ 20 - 20
src/AppModels/Vms/MinerProfileViewModel.cs

@@ -69,17 +69,17 @@ namespace NTMiner.Vms {
                 if (this.IsSystemName) {
                     this.MinerName = NTKeyword.GetSafeMinerName(NTMinerContext.ThisPcName);
                 }
-                VirtualRoot.BuildCmdPath<SetAutoStartCommand>(message => {
+                VirtualRoot.BuildCmdPath<SetAutoStartCommand>(this.GetType(), LogEnum.None, message => {
                     this.IsAutoStart = message.IsAutoStart;
                     this.IsAutoBoot = message.IsAutoBoot;
-                }, this.GetType(), LogEnum.None);
-                VirtualRoot.BuildEventPath<StartingMineFailedEvent>("开始挖矿失败", LogEnum.DevConsole,
+                });
+                VirtualRoot.BuildEventPath<StartingMineFailedEvent>("开始挖矿失败", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         IsMining = false;
                         NTMinerConsole.UserError(message.Message);
-                    }, location: this.GetType());
+                    });
                 // 群控客户端已经有一个执行RefreshWsStateCommand命令的路径了
-                VirtualRoot.BuildCmdPath<RefreshWsStateCommand>(message => {
+                VirtualRoot.BuildCmdPath<RefreshWsStateCommand>(this.GetType(), LogEnum.DevConsole, message => {
                     #region
                     if (message.WsClientState != null) {
                         this.WsServerIp = message.WsClientState.WsServerIp;
@@ -100,8 +100,8 @@ namespace NTMiner.Vms {
                         }
                     }
                     #endregion
-                }, this.GetType(), LogEnum.DevConsole);
-                VirtualRoot.BuildEventPath<Per1SecondEvent>("外网群控重试秒表倒计时", LogEnum.None, path: message => {
+                });
+                VirtualRoot.BuildEventPath<Per1SecondEvent>("外网群控重试秒表倒计时", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
                     if (IsOuterUserEnabled && !IsWsOnline) {
                         if (WsNextTrySecondsDelay > 0) {
                             WsNextTrySecondsDelay--;
@@ -111,12 +111,12 @@ namespace NTMiner.Vms {
                         }
                         OnPropertyChanged(nameof(WsLastTryOnText));
                     }
-                }, this.GetType());
-                VirtualRoot.BuildEventPath<WsServerOkEvent>("服务器Ws服务已可用", LogEnum.DevConsole, path: message => {
+                });
+                VirtualRoot.BuildEventPath<WsServerOkEvent>("服务器Ws服务已可用", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     if (IsOuterUserEnabled && !IsWsOnline) {
                         StartOrStopWs();
                     }
-                }, this.GetType());
+                });
             }
             NTMinerContext.SetRefreshArgsAssembly((reason) => {
                 NTMinerConsole.DevDebug(() => $"RefreshArgsAssembly" + reason, ConsoleColor.Cyan);
@@ -145,17 +145,17 @@ namespace NTMiner.Vms {
                     this.ArgsAssembly = string.Empty;
                 }
             });
-            AppRoot.BuildEventPath<AutoBootStartRefreshedEvent>("刷新开机启动和自动挖矿的展示", LogEnum.DevConsole,
+            AppRoot.BuildEventPath<AutoBootStartRefreshedEvent>("刷新开机启动和自动挖矿的展示", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     this.OnPropertyChanged(nameof(IsAutoBoot));
                     this.OnPropertyChanged(nameof(IsAutoStart));
-                }, location: this.GetType());
-            AppRoot.BuildEventPath<MinerProfilePropertyChangedEvent>("MinerProfile设置变更后刷新VM内存", LogEnum.DevConsole,
+                });
+            AppRoot.BuildEventPath<MinerProfilePropertyChangedEvent>("MinerProfile设置变更后刷新VM内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     OnPropertyChanged(message.PropertyName);
-                }, location: this.GetType());
+                });
 
-            VirtualRoot.BuildEventPath<LocalContextReInitedEventHandledEvent>("本地上下文视图模型集刷新后刷新界面", LogEnum.DevConsole,
+            VirtualRoot.BuildEventPath<LocalContextReInitedEventHandledEvent>("本地上下文视图模型集刷新后刷新界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     AllPropertyChanged();
                     if (CoinVm != null) {
@@ -164,13 +164,13 @@ namespace NTMiner.Vms {
                         CoinVm.CoinProfile?.OnPropertyChanged(nameof(CoinVm.CoinProfile.SelectedWallet));
                         CoinVm.CoinKernel?.CoinKernelProfile.SelectedDualCoin?.CoinProfile?.OnPropertyChanged(nameof(CoinVm.CoinProfile.SelectedDualCoinWallet));
                     }
-                }, location: this.GetType());
-            VirtualRoot.BuildEventPath<CoinVmAddedEvent>("Vm集添加了新币种后刷新MinerProfileVm内存", LogEnum.DevConsole, path: message => {
+                });
+            VirtualRoot.BuildEventPath<CoinVmAddedEvent>("Vm集添加了新币种后刷新MinerProfileVm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                 OnPropertyChanged(nameof(CoinVm));
-            }, this.GetType());
-            VirtualRoot.BuildEventPath<CoinVmRemovedEvent>("Vm集删除了新币种后刷新MinerProfileVm内存", LogEnum.DevConsole, path: message => {
+            });
+            VirtualRoot.BuildEventPath<CoinVmRemovedEvent>("Vm集删除了新币种后刷新MinerProfileVm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                 OnPropertyChanged(nameof(CoinVm));
-            }, this.GetType());
+            });
         }
 
         public void RefreshWsDaemonState() {

+ 6 - 6
src/AppModels/Vms/ServerMessagesViewModel.cs

@@ -49,11 +49,11 @@ namespace NTMiner.Vms {
                     VirtualRoot.Execute(new LoadNewServerMessageCommand());
                 }));
             });
-            VirtualRoot.BuildEventPath<ServerMessagesClearedEvent>("清空了本地存储的服务器消息后刷新Vm内存", LogEnum.DevConsole,
+            VirtualRoot.BuildEventPath<ServerMessagesClearedEvent>("清空了本地存储的服务器消息后刷新Vm内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     Init();
-                }, location: this.GetType());
-            VirtualRoot.BuildEventPath<NewServerMessageLoadedEvent>("从服务器加载了新消息后刷新Vm内存", LogEnum.DevConsole,
+                });
+            VirtualRoot.BuildEventPath<NewServerMessageLoadedEvent>("从服务器加载了新消息后刷新Vm内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     UIThread.Execute(() => {
                         foreach (var item in message.Data) {
@@ -88,8 +88,8 @@ namespace NTMiner.Vms {
                         }
                         OnPropertyChanged(nameof(IsNoRecord));
                     });
-                }, location: this.GetType());
-            VirtualRoot.BuildEventPath<NewDayEvent>("新的一天到来时刷新消息集中的可读性时间戳展示", LogEnum.DevConsole,
+                });
+            VirtualRoot.BuildEventPath<NewDayEvent>("新的一天到来时刷新消息集中的可读性时间戳展示", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     if (QueryResults == null) {
                         return;
@@ -103,7 +103,7 @@ namespace NTMiner.Vms {
                             break;
                         }
                     }
-                }, location: this.GetType());
+                });
         }
 
         private void Init() {

+ 4 - 4
src/AppModels/Vms/StartStopMineButtonViewModel.cs

@@ -12,7 +12,7 @@ namespace NTMiner.Vms {
             if (WpfUtil.IsInDesignMode) {
                 return;
             }
-            VirtualRoot.BuildCmdPath<StopMineCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<StopMineCommand>(this.GetType(), LogEnum.DevConsole, path: message => {
                 if (!NTMinerContext.Instance.IsMining) {
                     this.MinerProfile.IsMining = false;
                 }
@@ -22,7 +22,7 @@ namespace NTMiner.Vms {
                         this.MinerProfile.IsMining = false;
                     }
                 });
-            }, this.GetType(), LogEnum.DevConsole);
+            });
             this.StartMine = new DelegateCommand(() => {
                 VirtualRoot.ThisLocalInfo(nameof(StartStopMineButtonViewModel), $"手动开始挖矿", toConsole: true);
                 NTMinerContext.Instance.StartMine();
@@ -39,7 +39,7 @@ namespace NTMiner.Vms {
                 NTMinerConsole.UserInfo($"{MinerProfile.AutoStartDelaySeconds.ToString()}秒后开始挖矿");
                 this.MinerProfile.IsMining = true;
                 IMessagePathId pathId = null;
-                pathId = VirtualRoot.BuildViaTimesLimitPath<Per1SecondEvent>("自动开始挖矿倒计时", LogEnum.None,
+                pathId = VirtualRoot.BuildViaTimesLimitPath<Per1SecondEvent>("自动开始挖矿倒计时", LogEnum.None, viaTimesLimit: MinerProfile.AutoStartDelaySeconds, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (!NTMinerContext.IsAutoStartCanceled) {
                             MineBtnText = $"倒计时{pathId.ViaTimesLimit.ToString()}";
@@ -50,7 +50,7 @@ namespace NTMiner.Vms {
                                 NTMinerContext.Instance.StartMine();
                             }
                         }
-                    }, location: this.GetType(), viaTimesLimit: MinerProfile.AutoStartDelaySeconds);
+                    });
             }
         }
 

+ 131 - 131
src/AppViews0/AppViewFactory.cs

@@ -21,336 +21,336 @@ namespace NTMiner {
 
         public override void BuildPaths() {
             var location = this.GetType();
-            VirtualRoot.BuildCmdPath<ShowDialogWindowCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<ShowDialogWindowCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     DialogWindow.ShowSoftDialog(new DialogWindowViewModel(message: message.Message, title: message.Title, onYes: message.OnYes, icon: message.Icon));
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowCalcCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowCalcCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     Calc.ShowWindow(message.CoinVm);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowLocalIpsCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowLocalIpsCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
-                    MinerClientUcs.LocalIpConfig.ShowWindow();
+                    LocalIpConfig.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowAboutPageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowAboutPageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     AboutPage.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowKernelOutputPageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowKernelOutputPageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     KernelOutputPage.ShowWindow(message.SelectedKernelOutputVm);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowKernelInputPageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowKernelInputPageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     KernelInputPage.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowTagBrandCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowTagBrandCommand>(location: location, LogEnum.DevConsole, path: message => {
                 if (NTMinerContext.IsBrandSpecified) {
                     return;
                 }
                 UIThread.Execute(() => {
                     BrandTag.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowCoinPageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowCoinPageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     CoinPage.ShowWindow(message.CurrentCoin, message.TabType);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowCoinGroupsCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowCoinGroupsCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     CoinGroupPage.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowSysDicPageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowSysDicPageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     SysDicPage.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowVirtualMemoryCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowVirtualMemoryCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerClientUcs.VirtualMemory.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowRestartWindowsCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowRestartWindowsCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     RestartWindows.ShowDialog(new RestartWindowsViewModel(message.CountDownSeconds));
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowNotificationSampleCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowNotificationSampleCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     NotificationSample.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowPropertyCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowPropertyCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     Property.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowMessagePathIdsCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowMessagePathIdsCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MessagePathIds.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowKernelsWindowCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowKernelsWindowCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     KernelsWindow.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowKernelDownloaderCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowKernelDownloaderCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     KernelDownloading.ShowWindow(message.KernelId, message.DownloadComplete);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditEnvironmentVariableCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditEnvironmentVariableCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     EnvironmentVariableEdit.ShowWindow(message.CoinKernelVm, message.EnvironmentVariable);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditInputSegmentCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditInputSegmentCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     InputSegmentEdit.ShowWindow(message.CoinKernelVm, message.Segment);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditCoinKernelCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditCoinKernelCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     CoinKernelEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditCoinCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditCoinCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     CoinEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowSpeedChartsCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowSpeedChartsCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     SpeedCharts.ShowWindow(message.GpuSpeedVm);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowFileWriterPageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowFileWriterPageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     FileWriterPage.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditFileWriterCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditFileWriterCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     FileWriterEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowFragmentWriterPageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowFragmentWriterPageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     FragmentWriterPage.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditFragmentWriterCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditFragmentWriterCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     FragmentWriterEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditGroupCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditGroupCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     GroupEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditServerMessageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditServerMessageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     ServerMessageEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditKernelInputCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditKernelInputCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     KernelInputEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditKernelOutputKeywordCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditKernelOutputKeywordCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     KernelOutputKeywordEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditKernelOutputTranslaterCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditKernelOutputTranslaterCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     KernelOutputTranslaterEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditKernelOutputCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditKernelOutputCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     KernelOutputEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowPackagesWindowCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowPackagesWindowCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     PackagesWindow.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditKernelCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditKernelCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     KernelEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditPackageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditPackageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     PackageEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditPoolKernelCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditPoolKernelCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     PoolKernelEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditPoolCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditPoolCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     PoolEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditSysDicItemCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditSysDicItemCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     SysDicItemEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditSysDicCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditSysDicCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     SysDicEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowKernelOutputKeywordsCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowKernelOutputKeywordsCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     KernelOutputKeywords.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditWalletCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditWalletCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     WalletEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
+            });
 
             #region MinerStudio
-            VirtualRoot.BuildCmdPath<ShowQQGroupQrCodeCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<ShowQQGroupQrCodeCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.QQGroupQrCode.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowCalcConfigCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowCalcConfigCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.CalcConfig.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowMinerClientsWindowCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowMinerClientsWindowCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioViews.MinerClientsWindow.ShowWindow(message.IsToggle);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowNTMinerUpdaterConfigCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowNTMinerUpdaterConfigCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.NTMinerUpdaterConfig.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowMinerClientFinderConfigCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowMinerClientFinderConfigCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.MinerClientFinderConfig.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowOverClockDataPageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowOverClockDataPageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.OverClockDataPage.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowMinerStudioVirtualMemoryCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowMinerStudioVirtualMemoryCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.VirtualMemory.ShowWindow(message.Vm);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowMinerStudioLocalIpsCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowMinerStudioLocalIpsCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.LocalIpConfig.ShowWindow(message.Vm);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowNTMinerWalletPageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowNTMinerWalletPageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.NTMinerWalletPage.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowUserPageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowUserPageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.UserPage.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowGpuNamePageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowGpuNamePageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.GpuNameCounts.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowActionCountPageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowActionCountPageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.ActionCounts.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowChangePassword>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowChangePassword>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.ChangePassword.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowWsServerNodePageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowWsServerNodePageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.WsServerNodePage.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowRemoteDesktopLoginDialogCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowRemoteDesktopLoginDialogCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.RemoteDesktopLogin.ShowWindow(message.Vm);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowMinerClientSettingCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowMinerClientSettingCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.MinerClientSetting.ShowWindow(message.Vm);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowMinerNamesSeterCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowMinerNamesSeterCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.MinerNamesSeter.ShowWindow(message.Vm);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowGpuProfilesPageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowGpuProfilesPageCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.GpuProfilesPage.ShowWindow(message.MinerClientsWindowVm);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<ShowMinerClientAddCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowMinerClientAddCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.MinerClientAdd.ShowWindow();
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditMinerGroupCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditMinerGroupCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.MinerGroupEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditNTMinerWalletCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditNTMinerWalletCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.NTMinerWalletEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditMineWorkCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditMineWorkCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.MineWorkEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditOverClockDataCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditOverClockDataCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.OverClockDataEdit.ShowWindow(message.FormType, message.Source);
                 });
-            }, location: location);
-            VirtualRoot.BuildCmdPath<EditColumnsShowCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<EditColumnsShowCommand>(location: location, LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     MinerStudioUcs.ColumnsShowEdit.ShowWindow(message.Source);
                 });
-            }, location: location);
+            });
             #endregion
         }
     }

+ 2 - 2
src/AppViews0/MinerStudio/Views/MinerClientsWindow.xaml.cs

@@ -133,7 +133,7 @@ namespace NTMiner.MinerStudio.Views {
             this.LocationChanged += (sender, e) => {
                 MoveConsoleWindow();
             };
-            this.BuildEventPath<Per1SecondEvent>("刷新倒计时秒表", LogEnum.None,
+            this.BuildEventPath<Per1SecondEvent>("刷新倒计时秒表", LogEnum.None, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     #region
                     var minerClients = Vm.MinerClients.ToArray();
@@ -154,7 +154,7 @@ namespace NTMiner.MinerStudio.Views {
                         MinerStudioRoot.MinerClientsWindowVm.QueryMinerClients(isAuto: true);
                     }
                     #endregion
-                }, location: this.GetType());
+                });
             NotiCenterWindow.Bind(this, ownerIsTopmost: true);
             MinerStudioRoot.MinerClientsWindowVm.QueryMinerClients();
         }

+ 2 - 2
src/AppViews0/MinerStudio/Views/Ucs/CalcConfig.xaml.cs

@@ -38,10 +38,10 @@ namespace NTMiner.MinerStudio.Views.Ucs {
             this.DataContext = this.Vm;
             InitializeComponent();
             this.OnLoaded((window) => {
-                window.BuildEventPath<CalcConfigSetInitedEvent>("收益计算器数据集刷新后刷新VM", LogEnum.DevConsole,
+                window.BuildEventPath<CalcConfigSetInitedEvent>("收益计算器数据集刷新后刷新VM", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         Vm.Refresh();
-                    }, location: this.GetType());
+                    });
             });
         }
 

+ 2 - 2
src/AppViews0/MinerStudio/Views/Ucs/GpuProfilesPage.xaml.cs

@@ -60,12 +60,12 @@ namespace NTMiner.MinerStudio.Views.Ucs {
                 uc.Unloaded += (object sender, RoutedEventArgs e) => {
                     minerClientsWindowVm.PropertyChanged -= onSelectedMinerClientsChanged;
                 };
-                window.BuildEventPath<GetGpuProfilesResponsedEvent>("收到GetGpuProfilesJson的响应", LogEnum.DevConsole, path: message => {
+                window.BuildEventPath<GetGpuProfilesResponsedEvent>("收到GetGpuProfilesJson的响应", LogEnum.DevConsole, typeof(GpuProfilesPage), PathPriority.Normal, path: message => {
                     if (message.ClientId != minerClientVm.ClientId) {
                         return;
                     }
                     vm.SetData(message.Data);
-                }, typeof(GpuProfilesPage));
+                });
                 MinerStudioRoot.MinerStudioService.GetGpuProfilesJsonAsync(minerClientVm);
                 return uc;
             }, fixedSize: false);

+ 2 - 2
src/AppViews0/MinerStudio/Views/Ucs/LocalIpConfig.xaml.cs

@@ -23,12 +23,12 @@ namespace NTMiner.MinerStudio.Views.Ucs {
                         window.DragMove();
                     }
                 };
-                window.BuildEventPath<GetLocalIpsResponsedEvent>("收到了获取挖矿端Ip的响应", LogEnum.DevConsole, path: message => {
+                window.BuildEventPath<GetLocalIpsResponsedEvent>("收到了获取挖矿端Ip的响应", LogEnum.DevConsole, typeof(LocalIpConfig), PathPriority.Normal, path: message => {
                     if (message.ClientId != vm.MinerClientVm.ClientId) {
                         return;
                     }
                     vm.LocalIpVms = message.Data.Select(a => new NTMiner.Vms.LocalIpViewModel(a)).ToList();
-                }, typeof(LocalIpConfig));
+                });
                 MinerStudioRoot.MinerStudioService.GetLocalIpsAsync(vm.MinerClientVm);
                 return uc;
             }, fixedSize: true);

+ 2 - 2
src/AppViews0/MinerStudio/Views/Ucs/MinerClient.xaml.cs

@@ -16,10 +16,10 @@ namespace NTMiner.MinerStudio.Views.Ucs {
             InitializeComponent();
             this.TbDateTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
             this.OnLoaded((window) => {
-                window.BuildEventPath<MinutePartChangedEvent>("整分钟时更新MinerClient上的日期时间计时器", LogEnum.None,
+                window.BuildEventPath<MinutePartChangedEvent>("整分钟时更新MinerClient上的日期时间计时器", LogEnum.None, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         this.TbDateTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
-                    }, location: this.GetType());
+                    });
             });
         }
 

+ 6 - 6
src/AppViews0/MinerStudio/Views/Ucs/UserPage.xaml.cs

@@ -31,25 +31,25 @@ namespace NTMiner.MinerStudio.Views.Ucs {
             this.DataContext = this.Vm;
             InitializeComponent();
             this.OnLoaded(window => {
-                window.BuildEventPath<Per20SecondEvent>("外网群控用户列表页面打开着时周期刷新", LogEnum.DevConsole, path: message => {
+                window.BuildEventPath<Per20SecondEvent>("外网群控用户列表页面打开着时周期刷新", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     Vm.Refresh();
-                }, this.GetType());
-                window.BuildEventPath<UserEnabledEvent>("外网群控用户列表页面打开着时,用户启用后刷新Vm内存", LogEnum.DevConsole, path: message => {
+                });
+                window.BuildEventPath<UserEnabledEvent>("外网群控用户列表页面打开着时,用户启用后刷新Vm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     UIThread.Execute(() => {
                         var userVm = Vm.QueryResults.FirstOrDefault(a => a.LoginName == message.Source.LoginName);
                         if (userVm != null) {
                             userVm.IsEnabled = true;
                         }
                     });
-                }, this.GetType());
-                window.BuildEventPath<UserDisabledEvent>("外网群控用户列表页面打开着时,用户禁用后刷新Vm内存", LogEnum.DevConsole, path: message => {
+                });
+                window.BuildEventPath<UserDisabledEvent>("外网群控用户列表页面打开着时,用户禁用后刷新Vm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     UIThread.Execute(() => {
                         var userVm = Vm.QueryResults.FirstOrDefault(a => a.LoginName == message.Source.LoginName);
                         if (userVm != null) {
                             userVm.IsEnabled = false;
                         }
                     });
-                }, this.GetType());
+                });
             });
         }
 

+ 2 - 2
src/AppViews0/MinerStudio/Views/Ucs/VirtualMemory.xaml.cs

@@ -21,12 +21,12 @@ namespace NTMiner.MinerStudio.Views.Ucs {
                 FooterVisible = Visibility.Collapsed
             }, ucFactory: (window) => {
                 MinerStudioRoot.MinerStudioService.GetDrivesAsync(vm.MinerClientVm);
-                window.BuildEventPath<GetDrivesResponsedEvent>("收到了GetDrives的响应时绑定到界面", LogEnum.DevConsole, path: message => {
+                window.BuildEventPath<GetDrivesResponsedEvent>("收到了GetDrives的响应时绑定到界面", LogEnum.DevConsole, typeof(VirtualMemory), PathPriority.Normal, path: message => {
                     if (message.ClientId != vm.MinerClientVm.ClientId) {
                         return;
                     }
                     vm.Drives = message.Data.Select(a => new DriveViewModel(a)).ToList();
-                }, typeof(VirtualMemory));
+                });
                 return new VirtualMemory(vm);
             }, fixedSize: false);
         }

+ 2 - 2
src/AppViews0/MinerStudio/Views/Ucs/WsServerNodePage.xaml.cs

@@ -29,9 +29,9 @@ namespace NTMiner.MinerStudio.Views.Ucs {
             this.DataContext = this.Vm;
             InitializeComponent();
             this.OnLoaded(window => {
-                window.BuildEventPath<Per20SecondEvent>("外网群控服务器节点列表页面打开着时周期刷新", LogEnum.None, path: message => {
+                window.BuildEventPath<Per20SecondEvent>("外网群控服务器节点列表页面打开着时周期刷新", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
                     Vm.DoRefresh();
-                }, this.GetType());
+                });
             });
         }
 

+ 4 - 4
src/AppViews0/Views/KernelsWindow.xaml.cs

@@ -42,16 +42,16 @@ namespace NTMiner.Views {
                 this.Width += 600;
             }
             this.TbUcName.Text = nameof(KernelsWindow);
-            this.BuildEventPath<MineStopedEvent>("当内核宝库窗口开着时如果是本地手动停止的挖矿则引发UserActionEvent事件", LogEnum.DevConsole,
+            this.BuildEventPath<MineStopedEvent>("当内核宝库窗口开着时如果是本地手动停止的挖矿则引发UserActionEvent事件", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     if (message.StopReason == StopMineReason.LocalUserAction) {
                         VirtualRoot.RaiseEvent(new UserActionEvent());
                     }
-                }, location: this.GetType());
-            this.BuildEventPath<LocalContextReInitedEventHandledEvent>("ServerContext的Vm集刷新后刷新内核宝库", LogEnum.DevConsole,
+                });
+            this.BuildEventPath<LocalContextReInitedEventHandledEvent>("ServerContext的Vm集刷新后刷新内核宝库", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     Vm.OnPropertyChanged(nameof(Vm.QueryResults));
-                }, location: this.GetType());
+                });
             AppRoot.KernelVms.PropertyChanged += Current_PropertyChanged;
             NotiCenterWindow.Bind(this);
             if (!Vm.MinerProfile.IsMining && ClientAppType.IsMinerClient) {

+ 8 - 8
src/AppViews0/Views/MainWindow.xaml.cs

@@ -167,21 +167,21 @@ namespace NTMiner.Views {
             this.LocationChanged += (sender, e) => {
                 MoveConsoleWindow();
             };
-            VirtualRoot.BuildCmdPath<TopmostCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<TopmostCommand>(this.GetType(), LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     if (!this.Topmost) {
                         this.Topmost = true;
                     }
                 });
-            }, this.GetType());
-            VirtualRoot.BuildCmdPath<UnTopmostCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<UnTopmostCommand>(this.GetType(), LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     if (this.Topmost) {
                         this.Topmost = false;
                     }
                 });
-            }, this.GetType());
-            VirtualRoot.BuildCmdPath<CloseMainWindowCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<CloseMainWindowCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     if (message.IsAutoNoUi) {
                         SwitchToNoUi();
@@ -190,8 +190,8 @@ namespace NTMiner.Views {
                         this.Close();
                     }
                 });
-            }, location: this.GetType());
-            this.BuildEventPath<Per1MinuteEvent>("挖矿中时自动切换为无界面模式", LogEnum.DevConsole,
+            });
+            this.BuildEventPath<Per1MinuteEvent>("挖矿中时自动切换为无界面模式", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     if (NTMinerContext.IsUiVisible && NTMinerContext.Instance.MinerProfile.IsAutoNoUi && NTMinerContext.Instance.IsMining) {
                         if (NTMinerContext.MainWindowRendedOn.AddMinutes(NTMinerContext.Instance.MinerProfile.AutoNoUiMinutes) < message.BornOn) {
@@ -199,7 +199,7 @@ namespace NTMiner.Views {
                             VirtualRoot.Execute(new CloseMainWindowCommand(isAutoNoUi: true));
                         }
                     }
-                }, location: this.GetType());
+                });
 #if DEBUG
             var elapsedMilliseconds = NTStopwatch.Stop();
             if (elapsedMilliseconds.ElapsedMilliseconds > NTStopwatch.ElapsedMilliseconds) {

+ 4 - 4
src/AppViews0/Views/Ucs/Calc.xaml.cs

@@ -33,13 +33,13 @@ namespace NTMiner.Views.Ucs {
             this.DataContext = this.Vm;
             InitializeComponent();
             this.OnLoaded((window) => {
-                window.BuildEventPath<CalcConfigSetInitedEvent>("收益计算器数据集刷新后刷新VM", LogEnum.DevConsole,
+                window.BuildEventPath<CalcConfigSetInitedEvent>("收益计算器数据集刷新后刷新VM", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         foreach (var coinVm in Vm.CoinVms.AllCoins) {
                             coinVm.CoinIncomeVm.Refresh();
                         }
-                    }, location: this.GetType());
-                window.BuildEventPath<Per1MinuteEvent>("当收益计算器页面打开着的时候周期刷新", LogEnum.None,
+                    });
+                window.BuildEventPath<Per1MinuteEvent>("当收益计算器页面打开着的时候周期刷新", LogEnum.None, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (Vm.CoinVms.AllCoins.Count == 0) {
                             return;
@@ -47,7 +47,7 @@ namespace NTMiner.Views.Ucs {
                         if (Vm.CoinVms.AllCoins.Max(a => a.CoinIncomeVm.ModifiedOn).AddMinutes(10) < DateTime.Now) {
                             NTMinerContext.Instance.CalcConfigSet.Init(forceRefresh: true);
                         }
-                    }, location: this.GetType());
+                    });
                 NTMinerContext.Instance.CalcConfigSet.Init(forceRefresh: true);
             });
         }

+ 4 - 4
src/AppViews0/Views/Ucs/CoinKernelSelect.xaml.cs

@@ -9,16 +9,16 @@ namespace NTMiner.Views.Ucs {
             this.Init(vm);
             InitializeComponent();
             this.OnLoaded(window => {
-                window.BuildEventPath<CoinKernelVmAddedEvent>("添加了币种内核后,如果添加的币种内核是当前选中的币种的币种内核则刷新币种内核选择下拉列表的Vm内存", LogEnum.DevConsole, path: message => {
+                window.BuildEventPath<CoinKernelVmAddedEvent>("添加了币种内核后,如果添加的币种内核是当前选中的币种的币种内核则刷新币种内核选择下拉列表的Vm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     if (message.Event.Source.CoinId == vm.Coin.Id) {
                         vm.OnPropertyChanged(nameof(vm.QueryResults));
                     }
-                }, this.GetType());
-                window.BuildEventPath<CoinKernelVmRemovedEvent>("删除了币种内核后,如果删除的币种内核是当前选中的币种的币种内核则刷新币种内核选择下拉列表的Vm内存", LogEnum.DevConsole, path: message => {
+                });
+                window.BuildEventPath<CoinKernelVmRemovedEvent>("删除了币种内核后,如果删除的币种内核是当前选中的币种的币种内核则刷新币种内核选择下拉列表的Vm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     if (message.Event.Source.CoinId == vm.Coin.Id) {
                         vm.OnPropertyChanged(nameof(vm.QueryResults));
                     }
-                }, this.GetType());
+                });
             });
         }
 

+ 4 - 4
src/AppViews0/Views/Ucs/CoinSelect.xaml.cs

@@ -9,14 +9,14 @@ namespace NTMiner.Views.Ucs {
             this.Init(vm);
             InitializeComponent();
             this.OnLoaded(window => {
-                window.BuildEventPath<CoinVmAddedEvent>("添加了币种后,刷新币种选择下拉列表的Vm内存", LogEnum.DevConsole, path: message => {
+                window.BuildEventPath<CoinVmAddedEvent>("添加了币种后,刷新币种选择下拉列表的Vm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     vm.OnPropertyChanged(nameof(vm.QueryResults));
                     vm.OnPropertyChanged(nameof(vm.HotCoins));
-                }, this.GetType());
-                window.BuildEventPath<CoinVmRemovedEvent>("删除了币种后,刷新币种选择下拉列表的Vm内存", LogEnum.DevConsole, path: message => {
+                });
+                window.BuildEventPath<CoinVmRemovedEvent>("删除了币种后,刷新币种选择下拉列表的Vm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     vm.OnPropertyChanged(nameof(vm.QueryResults));
                     vm.OnPropertyChanged(nameof(vm.HotCoins));
-                }, this.GetType());
+                });
             });
         }
 

+ 2 - 2
src/AppViews0/Views/Ucs/InnerProperty.xaml.cs

@@ -13,11 +13,11 @@ namespace NTMiner.Views.Ucs {
             this.DataContext = this.Vm;
             InitializeComponent();
             this.OnLoaded(window => {
-                window.BuildEventPath<ServerJsonVersionChangedEvent>("刷新展示的ServerJsonVersion", LogEnum.DevConsole, path: message => {
+                window.BuildEventPath<ServerJsonVersionChangedEvent>("刷新展示的ServerJsonVersion", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal, path: message => {
                     if (message.IsChagned) {
                         Vm.ServerJsonVersion = message.NewVersion;
                     }
-                }, location: this.GetType());
+                });
             });
         }
 

+ 2 - 2
src/AppViews0/Views/Ucs/MinerProfileDual.xaml.cs

@@ -14,7 +14,7 @@ namespace NTMiner.Views.Ucs {
             this.DataContext = MinerProfileViewModel.Instance;
             InitializeComponent();
             this.OnLoaded((window) => {
-                window.BuildEventPath<LocalContextReInitedEventHandledEvent>("本地上下文视图模型集刷新后刷新界面上的popup", LogEnum.DevConsole,
+                window.BuildEventPath<LocalContextReInitedEventHandledEvent>("本地上下文视图模型集刷新后刷新界面上的popup", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         UIThread.Execute(() => {
                             if (Vm.MineWork != null) {
@@ -30,7 +30,7 @@ namespace NTMiner.Views.Ucs {
                                 OpenDualCoinWalletPopup();
                             }
                         });
-                    }, location: this.GetType());
+                    });
             });
         }
 

+ 2 - 2
src/AppViews0/Views/Ucs/MinerProfileIndex.xaml.cs

@@ -18,7 +18,7 @@ namespace NTMiner.Views.Ucs {
             this.DataContext = this.Vm;
             InitializeComponent();
             this.OnLoaded((window) => {
-                window.BuildEventPath<LocalContextReInitedEventHandledEvent>("上下文视图模型集刷新后刷新界面上的popup", LogEnum.DevConsole, 
+                window.BuildEventPath<LocalContextReInitedEventHandledEvent>("上下文视图模型集刷新后刷新界面上的popup", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         UIThread.Execute(() => {
                             if (Vm.MinerProfile.MineWork != null) {
@@ -40,7 +40,7 @@ namespace NTMiner.Views.Ucs {
                                 OpenMainCoinWalletPopup();
                             }
                         });
-                }, location: this.GetType());
+                    });
             });
 #if DEBUG
             var elapsedMilliseconds = NTStopwatch.Stop();

+ 2 - 2
src/AppViews0/Views/Ucs/MinerProfileOption.xaml.cs

@@ -16,9 +16,9 @@ namespace NTMiner.Views.Ucs {
             _outerUserGroupBg = OuterUserGroup.BorderBrush;
             _automationGroupBg = AutomationGroup.BorderBrush;
             this.OnLoaded(window => {
-                VirtualRoot.BuildEventPath<SignUpedEvent>("注册了新外网群控用户后自动填入外网群控用户名", LogEnum.None, path: message => {
+                VirtualRoot.BuildEventPath<SignUpedEvent>("注册了新外网群控用户后自动填入外网群控用户名", LogEnum.None, this.GetType(), PathPriority.Normal, path: message => {
                     this.Vm.OuterUserId = message.LoginName;
-                }, this.GetType());
+                });
             });
         }
 

+ 2 - 2
src/AppViews0/Views/Ucs/RestartWindows.xaml.cs

@@ -28,7 +28,7 @@ namespace NTMiner.Views.Ucs {
             InitializeComponent();
             this.OnLoaded(window => {
                 IMessagePathId messagePathId = null;
-                messagePathId = window.BuildViaTimesLimitPath<Per1SecondEvent>("重启倒计时", LogEnum.None, path: message => {
+                messagePathId = window.BuildViaTimesLimitPath<Per1SecondEvent>("重启倒计时", LogEnum.None, Vm.Seconds, location: this.GetType(), PathPriority.Normal, path: message => {
                     if (_isCanceled) {
                         return;
                     }
@@ -36,7 +36,7 @@ namespace NTMiner.Views.Ucs {
                     if (messagePathId.ViaTimesLimit == 0) {
                         Windows.Power.Restart();
                     }
-                }, Vm.Seconds, location: this.GetType());
+                });
             });
         }
 

+ 4 - 4
src/AppViews0/Views/Ucs/ServerMessages.xaml.cs

@@ -14,10 +14,10 @@ namespace NTMiner.Views.Ucs {
             InitializeComponent();
             this.OnLoaded(window => {
                 if (ClientAppType.IsMinerStudio) {
-                    window.BuildEventPath<Per1MinuteEvent>("周期刷新群控客户端的服务器消息集", LogEnum.DevConsole,
-                    path: message => {
-                        VirtualRoot.Execute(new LoadNewServerMessageCommand());
-                    }, location: this.GetType());
+                    window.BuildEventPath<Per1MinuteEvent>("周期刷新群控客户端的服务器消息集", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
+                        path: message => {
+                            VirtualRoot.Execute(new LoadNewServerMessageCommand());
+                        });
                 }
             });
         }

+ 2 - 2
src/AppViews0/Views/Ucs/SpeedCharts.xaml.cs

@@ -47,7 +47,7 @@ namespace NTMiner.Views.Ucs {
             }
             Guid mainCoinId = NTMinerContext.Instance.MinerProfile.CoinId;
             this.OnLoaded((window) => {
-                window.BuildEventPath<GpuSpeedChangedEvent>("显卡算力变更后刷新算力图界面", LogEnum.DevConsole,
+                window.BuildEventPath<GpuSpeedChangedEvent>("显卡算力变更后刷新算力图界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: (message) => {
                         UIThread.Execute(() => {
                             if (mainCoinId != NTMinerContext.Instance.MinerProfile.CoinId) {
@@ -110,7 +110,7 @@ namespace NTMiner.Views.Ucs {
                                 speedChartVm.SetAxisLimits(now);
                             }
                         });
-                    }, location: this.GetType());
+                    });
             });
 
             Vm.PropertyChanged += (object sender, System.ComponentModel.PropertyChangedEventArgs e) => {

+ 18 - 18
src/AppViews0/Views/Ucs/StateBar.xaml.cs

@@ -23,7 +23,7 @@ namespace NTMiner.Views.Ucs {
                     Vm.OnPropertyChanged(nameof(Vm.AutoAdminLogonToolTip));
                     VirtualRoot.Execute(new RefreshIsRemoteDesktopEnabledCommand());
                 };
-                window.BuildEventPath<PoolDelayPickedEvent>("从内核输出中提取了矿池延实时展示到界面", LogEnum.DevConsole,
+                window.BuildEventPath<PoolDelayPickedEvent>("从内核输出中提取了矿池延实时展示到界面", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         if (message.IsDual) {
                             Vm.DualPoolDelayText = message.PoolDelayText;
@@ -31,31 +31,31 @@ namespace NTMiner.Views.Ucs {
                         else {
                             Vm.PoolDelayText = message.PoolDelayText;
                         }
-                    }, location: this.GetType());
-                window.BuildEventPath<MineStartedEvent>("开始挖矿后清空矿池延时 & 挖矿开始后将内核自我重启计数清零", LogEnum.DevConsole,
+                    });
+                window.BuildEventPath<MineStartedEvent>("开始挖矿后清空矿池延时 & 挖矿开始后将内核自我重启计数清零", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         Vm.PoolDelayText = string.Empty;
                         Vm.DualPoolDelayText = string.Empty;
                         Vm.OnPropertyChanged(nameof(Vm.KernelSelfRestartCountText));
-                    }, location: this.GetType());
-                window.BuildEventPath<MineStopedEvent>("停止挖矿后将清空矿池延时", LogEnum.DevConsole,
+                    });
+                window.BuildEventPath<MineStopedEvent>("停止挖矿后将清空矿池延时", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         Vm.PoolDelayText = string.Empty;
                         Vm.DualPoolDelayText = string.Empty;
-                    }, location: this.GetType());
-                window.BuildEventPath<CpuPackageStateChangedEvent>("CPU包状态变更后刷新Vm内存", LogEnum.None,
+                    });
+                window.BuildEventPath<CpuPackageStateChangedEvent>("CPU包状态变更后刷新Vm内存", LogEnum.None, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         UpdateCpuView();
-                    }, location: this.GetType());
-                window.BuildEventPath<LocalIpSetInitedEvent>("本机IP集刷新后刷新状态栏", LogEnum.DevConsole,
+                    });
+                window.BuildEventPath<LocalIpSetInitedEvent>("本机IP集刷新后刷新状态栏", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         Vm.RefreshLocalIps();
-                    }, location: this.GetType());
-                window.BuildEventPath<MinutePartChangedEvent>("时间的分钟部分变更过更新计时器显示", LogEnum.None,
+                    });
+                window.BuildEventPath<MinutePartChangedEvent>("时间的分钟部分变更过更新计时器显示", LogEnum.None, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         Vm.UpdateDateTime();
-                    }, location: this.GetType());
-                window.BuildEventPath<Per1SecondEvent>("挖矿计时秒表", LogEnum.None,
+                    });
+                window.BuildEventPath<Per1SecondEvent>("挖矿计时秒表", LogEnum.None, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         DateTime now = DateTime.Now;
                         Vm.UpdateBootTimeSpan(now - NTMinerContext.Instance.CreatedOn);
@@ -63,15 +63,15 @@ namespace NTMiner.Views.Ucs {
                         if (mineContext != null && mineContext.MineStartedOn != DateTime.MinValue) {
                             Vm.UpdateMineTimeSpan(now - mineContext.MineStartedOn);
                         }
-                    }, location: this.GetType());
-                window.BuildEventPath<AppVersionChangedEvent>("发现了服务端新版本", LogEnum.DevConsole,
+                    });
+                window.BuildEventPath<AppVersionChangedEvent>("发现了服务端新版本", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         Vm.SetCheckUpdateForeground(isLatest: EntryAssemblyInfo.CurrentVersion >= NTMinerContext.ServerVersion);
-                    }, location: this.GetType());
-                window.BuildEventPath<KernelSelfRestartedEvent>("内核自我重启时刷新计数器", LogEnum.DevConsole,
+                    });
+                window.BuildEventPath<KernelSelfRestartedEvent>("内核自我重启时刷新计数器", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         Vm.OnPropertyChanged(nameof(Vm.KernelSelfRestartCountText));
-                    }, location: this.GetType());
+                    });
                 window.BuildCmdPath<RefreshIsRemoteDesktopEnabledCommand>(LogEnum.DevConsole, 
                     path: message => {
                         Vm.RefreshIsRemoteDesktopEnabled();

+ 4 - 4
src/AppViews0/Views/Ucs/WalletSelect.xaml.cs

@@ -10,16 +10,16 @@ namespace NTMiner.Views.Ucs {
             this.Init(vm);
             InitializeComponent();
             this.OnLoaded(window => {
-                window.BuildEventPath<WalletVmAddedEvent>("添加了钱包后,如果添加的钱包是当前选中的币种的钱包则刷新钱包选择下拉列表的Vm内存", LogEnum.DevConsole, path: message => {
+                window.BuildEventPath<WalletVmAddedEvent>("添加了钱包后,如果添加的钱包是当前选中的币种的钱包则刷新钱包选择下拉列表的Vm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     if (message.Event.Source.CoinId == vm.Coin.Id) {
                         vm.OnPropertyChanged(nameof(vm.QueryResults));
                     }
-                }, this.GetType());
-                window.BuildEventPath<WalletVmRemovedEvent>("删除了钱包后,如果删除的钱包是当前选中的币种的钱包则刷新钱包选择下拉列表的Vm内存", LogEnum.DevConsole, path: message => {
+                });
+                window.BuildEventPath<WalletVmRemovedEvent>("删除了钱包后,如果删除的钱包是当前选中的币种的钱包则刷新钱包选择下拉列表的Vm内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                     if (message.Event.Source.CoinId == vm.Coin.Id) {
                         vm.OnPropertyChanged(nameof(vm.QueryResults));
                     }
-                }, this.GetType());
+                });
             });
         }
 

+ 2 - 2
src/CalcConfigUpdater/Program.cs

@@ -42,10 +42,10 @@ namespace NTMiner {
                 // 将服务器地址设为localhost从而使用内网ip访问免于验证用户名密码
                 RpcRoot.SetOfficialServerAddress(NTKeyword.Localhost);
                 NTMinerRegistry.SetAutoBoot("NTMiner.CalcConfigUpdater", true);
-                VirtualRoot.BuildEventPath<Per10MinuteEvent>("每10分钟更新收益计算器", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<Per10MinuteEvent>("每10分钟更新收益计算器", LogEnum.DevConsole, location: typeof(Program), PathPriority.Normal,
                     path: message => {
                         UpdateAsync();
-                    }, location: typeof(Program));
+                    });
                 UpdateAsync();
                 NTMinerConsole.UserInfo("输入exit并回车可以停止服务!");
 

+ 30 - 30
src/MinerClient/App.xaml.cs

@@ -85,11 +85,11 @@ namespace NTMiner {
                 }
                 BuildPaths();
                 NTMinerContext.Instance.Init(() => {
-                    VirtualRoot.BuildCmdPath<ShowSignUpPageCommand>(path: message => {
+                    VirtualRoot.BuildCmdPath<ShowSignUpPageCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                         UIThread.Execute(() => {
                             SignUpPage.ShowWindow();
                         });
-                    }, location: this.GetType());
+                    });
                     _appViewFactory.BuildPaths();
                     if (VirtualRoot.IsLTWin10) {
                         VirtualRoot.ThisLocalWarn(nameof(App), AppRoot.LowWinMessage, toConsole: true);
@@ -170,16 +170,16 @@ namespace NTMiner {
 
         private void BuildCommonPaths() {
             // 之所以提前到这里是因为升级之前可能需要下载升级器,下载升级器时需要下载器
-            VirtualRoot.BuildCmdPath<ShowFileDownloaderCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<ShowFileDownloaderCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 FileDownloader.ShowWindow(message.DownloadFileUrl, message.FileTitle, message.DownloadComplete);
-            }, location: this.GetType());
-            VirtualRoot.BuildCmdPath<UpgradeCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<UpgradeCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 AppRoot.Upgrade(message.FileName, message.Callback);
-            }, location: this.GetType());
+            });
         }
 
         private void BuildPaths() {
-            VirtualRoot.BuildCmdPath<MinerClientActionCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<MinerClientActionCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 #region
                 switch (message.ActionType) {
                     case MinerClientActionType.SwitchRadeonGpuOn:
@@ -195,9 +195,9 @@ namespace NTMiner {
                         break;
                 }
                 #endregion
-            }, location: this.GetType());
+            });
             #region 处理显示主界面命令
-            VirtualRoot.BuildCmdPath<ShowMainWindowCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<ShowMainWindowCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     _appViewFactory.ShowMainWindow(message.IsToggle, out Window _);
                     // 使状态栏显示显示最新状态
@@ -215,36 +215,36 @@ namespace NTMiner {
                         AppRoot.GpuSpeedVms.Refresh();
                     }
                 });
-            }, location: this.GetType());
+            });
             #endregion
             #region 周期确保守护进程在运行
-            VirtualRoot.BuildEventPath<Per1MinuteEvent>("周期确保守护进程在运行", LogEnum.DevConsole,
+            VirtualRoot.BuildEventPath<Per1MinuteEvent>("周期确保守护进程在运行", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     Daemon.DaemonUtil.RunNTMinerDaemon();
                     NoDevFee.NoDevFeeUtil.RunNTMinerNoDevFee();
-                }, location: this.GetType());
+                });
             #endregion
             #region 开始和停止挖矿后
-            VirtualRoot.BuildEventPath<StartingMineEvent>("开始挖矿时更新挖矿按钮状态", LogEnum.DevConsole,
+            VirtualRoot.BuildEventPath<StartingMineEvent>("开始挖矿时更新挖矿按钮状态", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     AppRoot.MinerProfileVm.IsMining = true;
                     // 因为无界面模式不一定会构建挖矿状态按钮,所以放在这里而不放在挖矿按钮的VM中
                     StartStopMineButtonViewModel.Instance.MineBtnText = "正在挖矿";
-                }, location: this.GetType());
-            VirtualRoot.BuildEventPath<MineStartedEvent>("启动1080ti小药丸、启动DevConsole? 更新挖矿按钮状态", LogEnum.DevConsole,
+                });
+            VirtualRoot.BuildEventPath<MineStartedEvent>("启动1080ti小药丸、启动DevConsole? 更新挖矿按钮状态", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     OhGodAnETHlargementPill.OhGodAnETHlargementPillUtil.Start();
-                }, location: this.GetType());
-            VirtualRoot.BuildEventPath<MineStopedEvent>("停止挖矿后停止1080ti小药丸 挖矿停止后更新界面挖矿状态", LogEnum.DevConsole,
+                });
+            VirtualRoot.BuildEventPath<MineStopedEvent>("停止挖矿后停止1080ti小药丸 挖矿停止后更新界面挖矿状态", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     AppRoot.MinerProfileVm.IsMining = false;
                     // 因为无界面模式不一定会构建挖矿状态按钮,所以放在这里而不放在挖矿按钮的VM中
                     StartStopMineButtonViewModel.Instance.MineBtnText = "尚未开始";
                     OhGodAnETHlargementPill.OhGodAnETHlargementPillUtil.Stop();
-                }, location: this.GetType());
+                });
             #endregion
             #region 处理禁用win10系统更新
-            VirtualRoot.BuildCmdPath<BlockWAUCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<BlockWAUCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 NTMiner.Windows.WindowsUtil.BlockWAU().ContinueWith(t => {
                     if (t.Exception == null) {
                         VirtualRoot.ThisLocalInfo(nameof(App), "禁用windows系统更新成功", OutEnum.Success);
@@ -253,10 +253,10 @@ namespace NTMiner {
                         VirtualRoot.ThisLocalError(nameof(App), "禁用windows系统更新失败", OutEnum.Error);
                     }
                 });
-            }, location: this.GetType());
+            });
             #endregion
             #region 优化windows
-            VirtualRoot.BuildCmdPath<Win10OptimizeCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<Win10OptimizeCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 NTMiner.Windows.WindowsUtil.Win10Optimize(e => {
                     if (e == null) {
                         VirtualRoot.ThisLocalInfo(nameof(App), "优化Windows成功", OutEnum.Success);
@@ -265,24 +265,24 @@ namespace NTMiner {
                         VirtualRoot.ThisLocalError(nameof(App), "优化Windows失败", OutEnum.Error);
                     }
                 });
-            }, location: this.GetType());
+            });
             #endregion
             #region 处理开启A卡计算模式
-            VirtualRoot.BuildCmdPath<SwitchRadeonGpuCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<SwitchRadeonGpuCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 if (AdlHelper.IsHasATIGpu) {
                     AppRoot.SwitchRadeonGpu(message.On);
                 }
-            }, location: this.GetType());
+            });
             #endregion
             #region 处理A卡驱动签名
-            VirtualRoot.BuildCmdPath<AtikmdagPatcherCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<AtikmdagPatcherCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 if (AdlHelper.IsHasATIGpu) {
                     AppRoot.OpenAtikmdagPatcher();
                 }
-            }, location: this.GetType());
+            });
             #endregion
             #region 启用或禁用windows远程桌面
-            VirtualRoot.BuildCmdPath<EnableRemoteDesktopCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<EnableRemoteDesktopCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 if (NTMinerRegistry.GetIsRdpEnabled()) {
                     return;
                 }
@@ -294,10 +294,10 @@ namespace NTMiner {
                         NTMinerRegistry.SetIsRdpEnabled(true);
                         Firewall.AddRdpRule();
                     }));
-            }, location: this.GetType());
+            });
             #endregion
             #region 启用或禁用windows开机自动登录
-            VirtualRoot.BuildCmdPath<EnableOrDisableWindowsAutoLoginCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<EnableOrDisableWindowsAutoLoginCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 if (NTMiner.Windows.OS.Instance.IsAutoAdminLogon) {
                     VirtualRoot.Execute(new UnTopmostCommand());
                     NTMiner.Windows.Cmd.RunClose("control", "userpasswords2");
@@ -310,7 +310,7 @@ namespace NTMiner {
                     VirtualRoot.Execute(new UnTopmostCommand());
                     NTMiner.Windows.Cmd.RunClose("control", "userpasswords2");
                 }
-            }, location: this.GetType());
+            });
             #endregion
         }
     }

+ 2 - 2
src/MinerClientFinder/Vms/MainWindowViewModel.cs

@@ -72,10 +72,10 @@ namespace NTMiner.Vms {
                     });
                 }
             });
-            VirtualRoot.BuildEventPath<LocalIpSetInitedEvent>("本机IP集刷新后刷新状态栏", LogEnum.DevConsole,
+            VirtualRoot.BuildEventPath<LocalIpSetInitedEvent>("本机IP集刷新后刷新状态栏", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     LocalIps = GetLocalIps();
-                }, location: this.GetType());
+                });
             Task.Factory.StartNew(() => {
                 var localIp = VirtualRoot.LocalIpSet.AsEnumerable().FirstOrDefault();
                 if (localIp != null) {

+ 2 - 2
src/MinerClientSelfHost/HttpServer.cs

@@ -19,13 +19,13 @@ namespace NTMiner {
                 config.Routes.MapHttpRoute("API Default", "api/{controller}/{action}");
                 s_httpServer = new HttpSelfHostServer(config);
                 s_httpServer.OpenAsync();
-                VirtualRoot.BuildEventPath<AppExitEvent>("退出HttpServer", LogEnum.None, path: message => {
+                VirtualRoot.BuildEventPath<AppExitEvent>("退出HttpServer", LogEnum.None, typeof(HttpServer), PathPriority.Normal, path: message => {
                     var tmp = s_httpServer;
                     if (tmp != null) {
                         s_httpServer = null;
                         tmp.Dispose();
                     }
-                }, typeof(HttpServer));
+                });
             }
             catch (Exception e) {
                 Logger.ErrorDebugLine(e);

+ 10 - 10
src/MinerStudio/App.xaml.cs

@@ -32,17 +32,17 @@ namespace NTMiner {
 
         protected override void OnStartup(StartupEventArgs e) {
             // 之所以提前到这里是因为升级之前可能需要下载升级器,下载升级器时需要下载器
-            VirtualRoot.BuildCmdPath<ShowFileDownloaderCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<ShowFileDownloaderCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 FileDownloader.ShowWindow(message.DownloadFileUrl, message.FileTitle, message.DownloadComplete);
-            }, location: this.GetType());
-            VirtualRoot.BuildCmdPath<UpgradeCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<UpgradeCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 AppRoot.Upgrade(message.FileName, message.Callback);
-            }, location: this.GetType());
-            VirtualRoot.BuildCmdPath<ShowSignUpPageCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ShowSignUpPageCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 UIThread.Execute(() => {
                     SignUpPage.ShowWindow();
                 });
-            }, location: this.GetType());
+            });
             if (AppUtil.GetMutex(NTKeyword.MinerStudioAppMutex)) {
                 this.ShutdownMode = ShutdownMode.OnExplicitShutdown;
                 // 因为登录窗口会用到VirtualRoot.Out,而Out的延迟自动关闭消息会用到倒计时
@@ -60,9 +60,9 @@ namespace NTMiner {
                                 MinerStudioRoot.MinerClientsWindowVm.QueryMinerClients();
                             }
                             else {
-                                VirtualRoot.BuildOnecePath<ClientSetInitedEvent>("刷新矿机列表界面", LogEnum.DevConsole, path: message => {
+                                VirtualRoot.BuildOnecePath<ClientSetInitedEvent>("刷新矿机列表界面", LogEnum.DevConsole, pathId: PathId.Empty, this.GetType(), PathPriority.Normal, path: message => {
                                     MinerStudioRoot.MinerClientsWindowVm.QueryMinerClients();
-                                }, pathId: PathId.Empty, this.GetType());
+                                });
                             }
                             AppRoot.NotifyIcon = ExtendedNotifyIcon.Create("群控客户端", isMinerStudio: true);
                             VirtualRoot.Execute(new ShowMinerClientsWindowCommand(isToggle: false));
@@ -73,9 +73,9 @@ namespace NTMiner {
                     Shutdown();
                 });
                 #region 处理显示主界面命令
-                VirtualRoot.BuildCmdPath<ShowMainWindowCommand>(path: message => {
+                VirtualRoot.BuildCmdPath<ShowMainWindowCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                     VirtualRoot.Execute(new ShowMinerClientsWindowCommand(isToggle: message.IsToggle));
-                }, location: this.GetType());
+                });
                 #endregion
                 HttpServer.Start($"http://{NTKeyword.Localhost}:{NTKeyword.MinerStudioPort.ToString()}");
             }

+ 2 - 2
src/NTMinerClient/Cleaner.cs

@@ -9,9 +9,9 @@ namespace NTMiner {
         public static Cleaner Instance { get; private set; } = new Cleaner();
 
         private Cleaner() {
-            VirtualRoot.BuildEventPath<Per24HourEvent>("周期清理过期日志、过期内核包、过期下载文件", LogEnum.DevConsole, message => {
+            VirtualRoot.BuildEventPath<Per24HourEvent>("周期清理过期日志、过期内核包、过期下载文件", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, message => {
                 AutoClear();
-            }, this.GetType());
+            });
         }
 
         public void Clear() {

+ 2 - 2
src/NTMinerClient/ComputerRoot.cs

@@ -13,10 +13,10 @@ namespace NTMiner {
                             _computer = new Computer();
                             _computer.Open();
                             _computer.CPUEnabled = true;
-                            VirtualRoot.BuildEventPath<AppExitEvent>($"程序退出时关闭OpenHardwareMonitor", LogEnum.None,
+                            VirtualRoot.BuildEventPath<AppExitEvent>($"程序退出时关闭OpenHardwareMonitor", LogEnum.None, typeof(VirtualRoot), PathPriority.Normal,
                                 message => {
                                     _computer?.Close();
-                                }, typeof(VirtualRoot));
+                                });
                         }
                     }
                 }

+ 2 - 2
src/NTMinerClient/Core/IServerContext.cs

@@ -13,8 +13,8 @@ namespace NTMiner.Core {
         /// 2,开始挖矿时作业模式变更了(切换了作业或由作业模式转入非作业模式或由非作业模式转入作业模式都属于作业模式变更)。
         /// </summary>
         void ReInit();
-        void AddCmdPath<TCmd>(LogEnum logType, Action<TCmd> action, Type location) where TCmd : ICmd;
-        void AddEventPath<TEvent>(string description, LogEnum logType, Action<TEvent> action, Type location) where TEvent : IEvent;
+        void AddCmdPath<TCmd>(LogEnum logType, Type location, Action<TCmd> action) where TCmd : ICmd;
+        void AddEventPath<TEvent>(string description, LogEnum logType, Type location, PathPriority priority, Action<TEvent> action) where TEvent : IEvent;
         ICoinGroupSet CoinGroupSet { get; }
         ICoinSet CoinSet { get; }
         IFileWriterSet FileWriterSet { get; }

+ 2 - 2
src/NTMinerClient/Core/Impl/CalcConfigSet.cs

@@ -11,10 +11,10 @@ namespace NTMiner.Core.Impl {
         public CalcConfigSet(INTMinerContext ntminerContext) {
             _ntminerContext = ntminerContext;
             if (ClientAppType.IsMinerClient) {
-                VirtualRoot.BuildOnecePath<HasBoot20SecondEvent>("初始化收益计算器", LogEnum.DevConsole,
+                VirtualRoot.BuildOnecePath<HasBoot20SecondEvent>("初始化收益计算器", LogEnum.DevConsole, pathId: PathId.Empty, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         Init();
-                    }, location: this.GetType(), pathId: PathId.Empty);
+                    });
             }
         }
 

+ 4 - 4
src/NTMinerClient/Core/Impl/ClientDataSet.cs

@@ -16,9 +16,9 @@ namespace NTMiner.Core.Impl {
                 }
             });
         }) {
-            VirtualRoot.BuildOnecePath<ClientSetInitedEvent>("开始拉取矿机算力的进程", LogEnum.None, path: message => {
+            VirtualRoot.BuildOnecePath<ClientSetInitedEvent>("开始拉取矿机算力的进程", LogEnum.None, PathId.Empty, this.GetType(), PathPriority.Normal, path: message => {
                 PullSpeedInit();
-            }, PathId.Empty, this.GetType());
+            });
         }
 
         private static LiteDatabase CreateLocalDb() {
@@ -60,7 +60,7 @@ namespace NTMiner.Core.Impl {
                 return;
             }
             _isPullSpeedInited = true;
-            VirtualRoot.BuildEventPath<Per10SecondEvent>("周期拉取矿机状态", LogEnum.DevConsole, message => {
+            VirtualRoot.BuildEventPath<Per10SecondEvent>("周期拉取矿机状态", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, message => {
                 if (RpcRoot.IsOuterNet) {
                     return;
                 }
@@ -96,7 +96,7 @@ namespace NTMiner.Core.Impl {
                     }
                     #endregion
                 });
-            }, this.GetType());
+            });
         }
 
         private Task CreatePullTask(ClientData clientData) {

+ 8 - 8
src/NTMinerClient/Core/Impl/LocalMessageSet.cs

@@ -21,7 +21,7 @@ namespace NTMiner.Core.Impl {
             if (ClientAppType.IsMinerClient) {
                 LocalMessageDtoSet = new LocalMessageDtoSet();
             }
-            VirtualRoot.BuildCmdPath<AddLocalMessageCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<AddLocalMessageCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 InitOnece();
                 var data = LocalMessageData.Create(message.Input);
                 List<ILocalMessage> removeds = new List<ILocalMessage>();
@@ -37,8 +37,8 @@ namespace NTMiner.Core.Impl {
                 }
                 LocalMessageDtoSet.Add(data.ToDto());
                 VirtualRoot.RaiseEvent(new LocalMessageAddedEvent(message.MessageId, data, removeds));
-            }, location: this.GetType());
-            VirtualRoot.BuildCmdPath<ClearLocalMessageSetCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<ClearLocalMessageSetCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 lock (_dbToInserts) {
                     _records.Clear();
                     _dbToRemoveIds.Clear();
@@ -53,13 +53,13 @@ namespace NTMiner.Core.Impl {
                     Logger.ErrorDebugLine(e);
                 }
                 VirtualRoot.RaiseEvent(new LocalMessageSetClearedEvent());
-            }, location: this.GetType());
-            VirtualRoot.BuildEventPath<Per1MinuteEvent>("周期保存LocalMessage到数据库", LogEnum.DevConsole, path: message => {
+            });
+            VirtualRoot.BuildEventPath<Per1MinuteEvent>("周期保存LocalMessage到数据库", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                 SaveToDb();
-            }, this.GetType());
-            VirtualRoot.BuildEventPath<AppExitEvent>("程序退出时保存LocalMessage到数据库", LogEnum.DevConsole, path: message => {
+            });
+            VirtualRoot.BuildEventPath<AppExitEvent>("程序退出时保存LocalMessage到数据库", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                 SaveToDb();
-            }, this.GetType());
+            });
         }
 
         private void SaveToDb() {

+ 6 - 6
src/NTMinerClient/Core/Impl/OverClockDataSet.cs

@@ -11,7 +11,7 @@ namespace NTMiner.Core.Impl {
 
         public OverClockDataSet(INTMinerContext ntminerContext) {
             _ntminerContext = ntminerContext;
-            VirtualRoot.BuildCmdPath<AddOverClockDataCommand>(path: (message) => {
+            VirtualRoot.BuildCmdPath<AddOverClockDataCommand>(location: this.GetType(), LogEnum.DevConsole, path: (message) => {
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
                 }
@@ -31,8 +31,8 @@ namespace NTMiner.Core.Impl {
                         VirtualRoot.Out.ShowError(response.ReadMessage(e), autoHideSeconds: 4);
                     }
                 });
-            }, location: this.GetType());
-            VirtualRoot.BuildCmdPath<UpdateOverClockDataCommand>(path: (message) => {
+            });
+            VirtualRoot.BuildCmdPath<UpdateOverClockDataCommand>(location: this.GetType(), LogEnum.DevConsole, path: (message) => {
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
                 }
@@ -52,8 +52,8 @@ namespace NTMiner.Core.Impl {
                     }
                 });
                 VirtualRoot.RaiseEvent(new OverClockDataUpdatedEvent(message.MessageId, entity));
-            }, location: this.GetType());
-            VirtualRoot.BuildCmdPath<RemoveOverClockDataCommand>(path: (message) => {
+            });
+            VirtualRoot.BuildCmdPath<RemoveOverClockDataCommand>(location: this.GetType(), LogEnum.DevConsole, path: (message) => {
                 if (message == null || message.EntityId == Guid.Empty) {
                     throw new ArgumentNullException();
                 }
@@ -70,7 +70,7 @@ namespace NTMiner.Core.Impl {
                         VirtualRoot.Out.ShowError(response.ReadMessage(e), autoHideSeconds: 4);
                     }
                 });
-            }, location: this.GetType());
+            });
         }
 
         protected override void Init() {

+ 2 - 2
src/NTMinerClient/Core/Impl/PoolSet.cs

@@ -99,7 +99,7 @@ namespace NTMiner.Core.Impl {
                         VirtualRoot.Execute(new RemovePoolKernelCommand(poolKernelId));
                     }
                 }, location: this.GetType());
-            context.AddEventPath<PoolDelayPickedEvent>("提取了矿池延时后记录进内存", LogEnum.DevConsole,
+            context.AddEventPath<PoolDelayPickedEvent>("提取了矿池延时后记录进内存", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 action: message => {
                     if (message.IsDual) {
                         if (_poolDelayById.TryGetValue(message.PoolId, out PoolDelay poolDelay)) {
@@ -123,7 +123,7 @@ namespace NTMiner.Core.Impl {
                             });
                         }
                     }
-                }, location: this.GetType());
+                });
         }
 
         protected override void Init() {

+ 4 - 4
src/NTMinerClient/Core/Impl/ServerContext.cs

@@ -46,18 +46,18 @@ namespace NTMiner.Core.Impl {
         /// <summary>
         /// 命令窗口。使用该方法的代码行应将前两个参数放在第一行以方便vs查找引用时展示出参数信息
         /// </summary>
-        public void AddCmdPath<TCmd>(LogEnum logType, Action<TCmd> action, Type location)
+        public void AddCmdPath<TCmd>(LogEnum logType, Type location, Action<TCmd> path)
             where TCmd : ICmd {
-            var messagePathId = VirtualRoot.BuildCmdPath(action, location, logType);
+            var messagePathId = VirtualRoot.BuildCmdPath(location, logType, path);
             _contextPathIds.Add(messagePathId);
         }
 
         /// <summary>
         /// 事件响应
         /// </summary>
-        public void AddEventPath<TEvent>(string description, LogEnum logType, Action<TEvent> action, Type location)
+        public void AddEventPath<TEvent>(string description, LogEnum logType, Type location, PathPriority priority, Action<TEvent> path)
             where TEvent : IEvent {
-            var messagePathId = VirtualRoot.BuildMessagePath(description, logType, action, location);
+            var messagePathId = VirtualRoot.BuildMessagePath(description, logType, location, priority, path);
             _contextPathIds.Add(messagePathId);
         }
 

+ 4 - 4
src/NTMinerClient/Core/Kernels/Impl/CoinKernelSet.cs

@@ -94,7 +94,7 @@ namespace NTMiner.Core.Kernels.Impl {
                         }
                     }
                 }, location: this.GetType());
-            context.AddEventPath<FileWriterRemovedEvent>("移除文件书写器后移除引用关系", LogEnum.DevConsole,
+            context.AddEventPath<FileWriterRemovedEvent>("移除文件书写器后移除引用关系", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 action: message => {
                     var repository = context.CreateServerRepository<CoinKernelData>();
                     var entities = _dicById.Values.Where(a => a.FileWriterIds.Contains(message.Source.GetId())).ToArray();
@@ -103,8 +103,8 @@ namespace NTMiner.Core.Kernels.Impl {
                         repository.Update(entity);
                         VirtualRoot.RaiseEvent(new CoinKernelUpdatedEvent(message.MessageId, entity));
                     }
-                }, location: this.GetType());
-            context.AddEventPath<FragmentWriterRemovedEvent>("移除命令行片段书写器后移除引用关系", LogEnum.DevConsole,
+                });
+            context.AddEventPath<FragmentWriterRemovedEvent>("移除命令行片段书写器后移除引用关系", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 action: message => {
                     var repository = context.CreateServerRepository<CoinKernelData>();
                     var entities = _dicById.Values.Where(a => a.FragmentWriterIds.Contains(message.Source.GetId())).ToArray();
@@ -113,7 +113,7 @@ namespace NTMiner.Core.Kernels.Impl {
                         repository.Update(entity);
                         VirtualRoot.RaiseEvent(new CoinKernelUpdatedEvent(message.MessageId, entity));
                     }
-                }, location: this.GetType());
+                });
         }
 
         public int Count {

+ 8 - 8
src/NTMinerClient/Core/MinerStudio/Impl/MineWorkSet.cs

@@ -6,13 +6,13 @@ namespace NTMiner.Core.MinerStudio.Impl {
         private readonly Dictionary<Guid, MineWorkData> _dicById = new Dictionary<Guid, MineWorkData>();
 
         public MineWorkSet() {
-            VirtualRoot.BuildEventPath<MinerStudioServiceSwitchedEvent>("切换了群口后台服务类型后刷新内存", LogEnum.DevConsole, path: message => {
+            VirtualRoot.BuildEventPath<MinerStudioServiceSwitchedEvent>("切换了群口后台服务类型后刷新内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                 _dicById.Clear();
                 base.DeferReInit();
                 // 初始化以触发MineWorkSetInitedEvent事件
                 InitOnece();
-            }, this.GetType());
-            VirtualRoot.BuildCmdPath<AddMineWorkCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<AddMineWorkCommand>(this.GetType(), LogEnum.DevConsole, path: message => {
                 InitOnece();
                 if (!_dicById.ContainsKey(message.Input.Id)) {
                     var repository = VirtualRoot.CreateLocalRepository<MineWorkData>();
@@ -22,8 +22,8 @@ namespace NTMiner.Core.MinerStudio.Impl {
                     repository.Add(data);
                     VirtualRoot.RaiseEvent(new MineWorkAddedEvent(message.MessageId, data));
                 }
-            }, this.GetType());
-            VirtualRoot.BuildCmdPath<UpdateMineWorkCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<UpdateMineWorkCommand>(this.GetType(), LogEnum.DevConsole, path: message => {
                 InitOnece();
                 if (_dicById.TryGetValue(message.Input.Id, out MineWorkData data)) {
                     var repository = VirtualRoot.CreateLocalRepository<MineWorkData>();
@@ -32,8 +32,8 @@ namespace NTMiner.Core.MinerStudio.Impl {
                     repository.Update(data);
                     VirtualRoot.RaiseEvent(new MineWorkUpdatedEvent(message.MessageId, data));
                 }
-            }, this.GetType());
-            VirtualRoot.BuildCmdPath<RemoveMineWorkCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<RemoveMineWorkCommand>(this.GetType(), LogEnum.DevConsole, path: message => {
                 InitOnece();
                 if (_dicById.TryGetValue(message.EntityId, out MineWorkData entity)) {
                     _dicById.Remove(message.EntityId);
@@ -42,7 +42,7 @@ namespace NTMiner.Core.MinerStudio.Impl {
                     MinerStudioPath.DeleteMineWorkFiles(message.EntityId);
                     VirtualRoot.RaiseEvent(new MineWorkRemovedEvent(message.MessageId, entity));
                 }
-            }, this.GetType());
+            });
         }
 
         protected override void Init() {

+ 8 - 8
src/NTMinerClient/Core/MinerStudio/Impl/MinerGroupSet.cs

@@ -6,13 +6,13 @@ namespace NTMiner.Core.MinerStudio.Impl {
         private readonly Dictionary<Guid, MinerGroupData> _dicById = new Dictionary<Guid, MinerGroupData>();
 
         public MinerGroupSet() {
-            VirtualRoot.BuildEventPath<MinerStudioServiceSwitchedEvent>("切换了群口后台服务类型后刷新内存", LogEnum.DevConsole, path: message => {
+            VirtualRoot.BuildEventPath<MinerStudioServiceSwitchedEvent>("切换了群口后台服务类型后刷新内存", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                 _dicById.Clear();
                 base.DeferReInit();
                 // 初始化以触发MinerGroupSetInitedEvent事件
                 InitOnece();
-            }, this.GetType());
-            VirtualRoot.BuildCmdPath<AddMinerGroupCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<AddMinerGroupCommand>(this.GetType(), LogEnum.DevConsole, path: message => {
                 InitOnece();
                 if (!_dicById.ContainsKey(message.Input.Id)) {
                     var repository = VirtualRoot.CreateLocalRepository<MinerGroupData>();
@@ -22,8 +22,8 @@ namespace NTMiner.Core.MinerStudio.Impl {
                     repository.Add(data);
                     VirtualRoot.RaiseEvent(new MinerGroupAddedEvent(message.MessageId, data));
                 }
-            }, this.GetType());
-            VirtualRoot.BuildCmdPath<UpdateMinerGroupCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<UpdateMinerGroupCommand>(this.GetType(), LogEnum.DevConsole, path: message => {
                 InitOnece();
                 if (_dicById.TryGetValue(message.Input.Id, out MinerGroupData data)) {
                     var repository = VirtualRoot.CreateLocalRepository<MinerGroupData>();
@@ -32,8 +32,8 @@ namespace NTMiner.Core.MinerStudio.Impl {
                     repository.Update(data);
                     VirtualRoot.RaiseEvent(new MinerGroupUpdatedEvent(message.MessageId, data));
                 }
-            }, this.GetType());
-            VirtualRoot.BuildCmdPath<RemoveMinerGroupCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<RemoveMinerGroupCommand>(this.GetType(), LogEnum.DevConsole, path: message => {
                 InitOnece();
                 if (_dicById.TryGetValue(message.EntityId, out MinerGroupData entity)) {
                     _dicById.Remove(message.EntityId);
@@ -41,7 +41,7 @@ namespace NTMiner.Core.MinerStudio.Impl {
                     repository.Remove(message.EntityId);
                     VirtualRoot.RaiseEvent(new MinerGroupRemovedEvent(message.MessageId, entity));
                 }
-            }, this.GetType());
+            });
         }
 
         protected override void Init() {

+ 6 - 6
src/NTMinerClient/Core/MinerStudio/Impl/NTMinerWalletSet.cs

@@ -7,7 +7,7 @@ namespace NTMiner.Core.MinerStudio.Impl {
         private readonly Dictionary<Guid, NTMinerWalletData> _dicById = new Dictionary<Guid, NTMinerWalletData>();
 
         public NTMinerWalletSet() {
-            VirtualRoot.BuildCmdPath<AddNTMinerWalletCommand>(path: (message) => {
+            VirtualRoot.BuildCmdPath<AddNTMinerWalletCommand>(location: this.GetType(), LogEnum.DevConsole, path: (message) => {
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
                 }
@@ -27,8 +27,8 @@ namespace NTMiner.Core.MinerStudio.Impl {
                         VirtualRoot.Out.ShowError(response.ReadMessage(e), autoHideSeconds: 4);
                     }
                 });
-            }, location: this.GetType());
-            VirtualRoot.BuildCmdPath<UpdateNTMinerWalletCommand>(path: (message) => {
+            });
+            VirtualRoot.BuildCmdPath<UpdateNTMinerWalletCommand>(location: this.GetType(), LogEnum.DevConsole, path: (message) => {
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
                 }
@@ -48,8 +48,8 @@ namespace NTMiner.Core.MinerStudio.Impl {
                     }
                 });
                 VirtualRoot.RaiseEvent(new NTMinerWalletUpdatedEvent(message.MessageId, entity));
-            }, location: this.GetType());
-            VirtualRoot.BuildCmdPath<RemoveNTMinerWalletCommand>(path: (message) => {
+            });
+            VirtualRoot.BuildCmdPath<RemoveNTMinerWalletCommand>(location: this.GetType(), LogEnum.DevConsole, path: (message) => {
                 if (message == null || message.EntityId == Guid.Empty) {
                     throw new ArgumentNullException();
                 }
@@ -66,7 +66,7 @@ namespace NTMiner.Core.MinerStudio.Impl {
                         VirtualRoot.Out.ShowError(response.ReadMessage(e), autoHideSeconds: 4);
                     }
                 });
-            }, location: this.GetType());
+            });
         }
 
         protected override void Init() {

+ 2 - 2
src/NTMinerClient/Core/MinerStudio/Impl/UserAppSettingSet.cs

@@ -8,7 +8,7 @@ namespace NTMiner.Core.MinerStudio.Impl {
         private List<UserAppSettingData> _userAppSettings;
 
         public UserAppSettingSet() {
-            VirtualRoot.BuildCmdPath<SetUserAppSettingCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<SetUserAppSettingCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 if (message.AppSetting == null) {
                     return;
                 }
@@ -38,7 +38,7 @@ namespace NTMiner.Core.MinerStudio.Impl {
                         VirtualRoot.Out.ShowError(response.ReadMessage(exception), autoHideSeconds: 4);
                     }
                 });
-            }, location: this.GetType());
+            });
         }
 
         public void Init(List<UserAppSettingData> userAppSettings) {

+ 4 - 4
src/NTMinerClient/Core/Profiles/Impl/GpuProfileSet.cs

@@ -11,7 +11,7 @@ namespace NTMiner.Core.Profiles.Impl {
         private GpuProfilesJsonDb _data = new GpuProfilesJsonDb();
 
         public GpuProfileSet(INTMinerContext ntminerContext) {
-            VirtualRoot.BuildCmdPath<AddOrUpdateGpuProfileCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<AddOrUpdateGpuProfileCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 GpuProfileData data = _data.GpuProfiles.FirstOrDefault(a => a.CoinId == message.Input.CoinId && a.Index == message.Input.Index);
                 if (data != null) {
                     data.Update(message.Input);
@@ -23,15 +23,15 @@ namespace NTMiner.Core.Profiles.Impl {
                     Save();
                 }
                 VirtualRoot.RaiseEvent(new GpuProfileAddedOrUpdatedEvent(message.MessageId, data));
-            }, location: this.GetType());
+            });
             // 注意:这个命令处理程序不能放在展示层注册。修复通过群控超频不生效的BUG:这是一个难以发现的老BUG,以前的版本也存
             // 在这个BUG,BUG具体表现是当没有点击过挖矿端主界面上的算力Tab页时通过群控超频无效。感谢矿友发现问题,已经修复。
-            VirtualRoot.BuildCmdPath<CoinOverClockCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<CoinOverClockCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 Task.Factory.StartNew(() => {
                     CoinOverClock(ntminerContext, message.CoinId);
                     VirtualRoot.RaiseEvent(new CoinOverClockDoneEvent(targetPathId: message.MessageId));
                 });
-            }, location: this.GetType());
+            });
         }
 
         protected override void Init() {

+ 6 - 6
src/NTMinerClient/Core/Profiles/Impl/WalletSet.cs

@@ -8,7 +8,7 @@ namespace NTMiner.Core.Profiles.Impl {
         private readonly INTMinerContext _ntminerContext;
         public WalletSet(INTMinerContext ntminerContext) {
             _ntminerContext = ntminerContext;
-            VirtualRoot.BuildCmdPath<AddWalletCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<AddWalletCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 InitOnece();
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
@@ -28,8 +28,8 @@ namespace NTMiner.Core.Profiles.Impl {
                 repository.Add(entity);
 
                 VirtualRoot.RaiseEvent(new WalletAddedEvent(message.MessageId, entity));
-            }, location: this.GetType());
-            VirtualRoot.BuildCmdPath<UpdateWalletCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<UpdateWalletCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 InitOnece();
                 if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
                     throw new ArgumentNullException();
@@ -51,8 +51,8 @@ namespace NTMiner.Core.Profiles.Impl {
                 repository.Update(entity);
 
                 VirtualRoot.RaiseEvent(new WalletUpdatedEvent(message.MessageId, entity));
-            }, location: this.GetType());
-            VirtualRoot.BuildCmdPath<RemoveWalletCommand>(path: (message) => {
+            });
+            VirtualRoot.BuildCmdPath<RemoveWalletCommand>(location: this.GetType(), LogEnum.DevConsole, path: (message) => {
                 InitOnece();
                 if (message == null || message.EntityId == Guid.Empty) {
                     throw new ArgumentNullException();
@@ -66,7 +66,7 @@ namespace NTMiner.Core.Profiles.Impl {
                 repository.Remove(entity.Id);
 
                 VirtualRoot.RaiseEvent(new WalletRemovedEvent(message.MessageId, entity));
-            }, location: this.GetType());
+            });
         }
 
         public void Refresh() {

+ 9 - 10
src/NTMinerClient/Core/Profiles/MinerProfile.cs

@@ -19,16 +19,15 @@ namespace NTMiner.Core.Profiles {
 
         public MinerProfile(INTMinerContext ntminerContext) {
             _ntminerContext = ntminerContext;
-            VirtualRoot.BuildCmdPath<RefreshAutoBootStartCommand>(
-                path: message => {
-                    var minerProfileRepository = ntminerContext.ServerContext.CreateLocalRepository<MinerProfileData>();
-                    var data = minerProfileRepository.GetAll().FirstOrDefault();
-                    if (data != null && _data != null) {
-                        _data.IsAutoBoot = data.IsAutoBoot;
-                        _data.IsAutoStart = data.IsAutoStart;
-                        VirtualRoot.RaiseEvent(new AutoBootStartRefreshedEvent());
-                    }
-                }, location: this.GetType());
+            VirtualRoot.BuildCmdPath<RefreshAutoBootStartCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
+                var minerProfileRepository = ntminerContext.ServerContext.CreateLocalRepository<MinerProfileData>();
+                var data = minerProfileRepository.GetAll().FirstOrDefault();
+                if (data != null && _data != null) {
+                    _data.IsAutoBoot = data.IsAutoBoot;
+                    _data.IsAutoStart = data.IsAutoStart;
+                    VirtualRoot.RaiseEvent(new AutoBootStartRefreshedEvent());
+                }
+            });
             Init(ntminerContext);
         }
 

+ 2 - 2
src/NTMinerClient/Cpus/Impl/CpuPackage.cs

@@ -17,7 +17,7 @@ namespace NTMiner.Cpus.Impl {
                 Task.Factory.StartNew(() => {
                     // 注意:第一次GetTemperature请求约需要160毫秒,所以提前在非UI线程做第一次请求。
                     GetTemperature();
-                    VirtualRoot.BuildEventPath<Per2SecondEvent>("周期更新CpuAll的状态", LogEnum.None,
+                    VirtualRoot.BuildEventPath<Per2SecondEvent>("周期更新CpuAll的状态", LogEnum.None, location: this.GetType(), PathPriority.Normal,
                         path: message => {
                             Task.Factory.StartNew(() => {
                                 // 因为获取cpu温度的操作耗时100毫秒
@@ -66,7 +66,7 @@ namespace NTMiner.Cpus.Impl {
                                     }
                                 }
                             });
-                        }, location: this.GetType());
+                        });
                 });
             }
         }

+ 2 - 2
src/NTMinerClient/Gpus/Impl/AMDGpuSet.cs

@@ -25,9 +25,9 @@ namespace NTMiner.Gpus.Impl {
 #endif
             this.Properties = new List<GpuSetProperty>();
             this.OverClock = new GpuOverClock(_adlHelper);
-            VirtualRoot.BuildEventPath<AppExitEvent>("程序退出时调用adlHelper.Close", LogEnum.None, message => {
+            VirtualRoot.BuildEventPath<AppExitEvent>("程序退出时调用adlHelper.Close", LogEnum.None, this.GetType(), PathPriority.Normal, message => {
                 _adlHelper.Close();
-            }, this.GetType());
+            });
             if (_adlHelper.ATIGpus.Count > 0) {
                 int i = 0;
                 foreach (var atiGpu in _adlHelper.ATIGpus) {

+ 6 - 6
src/NTMinerClient/Gpus/Impl/GpusSpeed.cs

@@ -14,12 +14,12 @@ namespace NTMiner.Gpus.Impl {
         private readonly INTMinerContext _ntminerContext;
         public GpusSpeed(INTMinerContext ntminerContext) {
             _ntminerContext = ntminerContext;
-            VirtualRoot.BuildEventPath<Per10MinuteEvent>("周期清除过期的历史算力", LogEnum.DevConsole,
+            VirtualRoot.BuildEventPath<Per10MinuteEvent>("周期清除过期的历史算力", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     ClearOutOfDateHistory();
-                }, location: this.GetType());
+                });
 
-            VirtualRoot.BuildEventPath<MineStopedEvent>("停止挖矿后产生一次0算力", LogEnum.DevConsole,
+            VirtualRoot.BuildEventPath<MineStopedEvent>("停止挖矿后产生一次0算力", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     var now = DateTime.Now;
                     foreach (var gpu in _ntminerContext.GpuSet.AsEnumerable()) {
@@ -28,9 +28,9 @@ namespace NTMiner.Gpus.Impl {
                             SetCurrentSpeed(gpuIndex: gpu.Index, speed: 0.0, isDual: true, now: now);
                         }
                     }
-                }, location: this.GetType());
+                });
 
-            VirtualRoot.BuildEventPath<MineStartedEvent>("挖矿开始时产生一次0算力0份额", LogEnum.DevConsole,
+            VirtualRoot.BuildEventPath<MineStartedEvent>("挖矿开始时产生一次0算力0份额", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     var now = DateTime.Now;
                     _ntminerContext.CoinShareSet.UpdateShare(message.MineContext.MainCoin.GetId(), 0, 0, now);
@@ -44,7 +44,7 @@ namespace NTMiner.Gpus.Impl {
                             SetCurrentSpeed(gpuIndex: gpu.Index, speed: 0.0, isDual: true, now: now);
                         }
                     }
-                }, location: this.GetType());
+                });
         }
 
         protected override void Init() {

+ 2 - 2
src/NTMinerClient/Gpus/Impl/TempGruarder.cs

@@ -23,7 +23,7 @@ namespace NTMiner.Gpus.Impl {
                 return;
             }
             _isInited = true;
-            VirtualRoot.BuildEventPath<Per1SecondEvent>("周期性调节风扇转速守卫温度防线", LogEnum.None,
+            VirtualRoot.BuildEventPath<Per1SecondEvent>("周期性调节风扇转速守卫温度防线", LogEnum.None, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     double ki = _ti > 0 ? _dt / _ti : _dt;
                     double kd = _td / _dt;
@@ -83,7 +83,7 @@ namespace NTMiner.Gpus.Impl {
 
                         _lastOutputCool[gpu.Index] = output;
                     }
-                }, location: this.GetType());
+                });
         }
     }
 }

+ 10 - 10
src/NTMinerClient/Mine/MineContext.cs

@@ -86,7 +86,7 @@ namespace NTMiner.Mine {
             }
             else {
                 AddOnecePath<MineStopedEvent>("挖矿停止后关闭非托管的日志句柄", LogEnum.DevConsole,
-                    action: message => {
+                    path: message => {
                         message.MineContext?.Close();
                     }, location: this.GetType(), pathId: Guid.Empty);
                 this.MineStartedOn = DateTime.Now;
@@ -151,14 +151,14 @@ namespace NTMiner.Mine {
         /// <summary>
         /// 事件响应
         /// </summary>
-        private void AddEventPath<TEvent>(string description, LogEnum logType, Action<TEvent> action, Type location)
+        private void AddEventPath<TEvent>(string description, LogEnum logType, Type location, PathPriority priority, Action<TEvent> path)
             where TEvent : IEvent {
-            var messagePathId = VirtualRoot.BuildMessagePath(description, logType, action, location);
+            var messagePathId = VirtualRoot.BuildMessagePath(description, logType, location, priority, path);
             _contextPathIds.Add(messagePathId);
         }
 
-        private void AddOnecePath<TMessage>(string description, LogEnum logType, Action<TMessage> action, Guid pathId, Type location) {
-            var messagePathId = VirtualRoot.BuildOnecePath(description, logType, action, pathId, location);
+        private void AddOnecePath<TMessage>(string description, LogEnum logType, Guid pathId, Type location, Action<TMessage> path) {
+            var messagePathId = VirtualRoot.BuildOnecePath(description, logType, pathId, location, PathPriority.Normal, path);
             _contextPathIds.Add(messagePathId);
         }
 
@@ -200,11 +200,11 @@ namespace NTMiner.Mine {
                         if (NTMinerContext.Instance.GpuProfileSet.IsOverClockEnabled(MainCoin.GetId())) {
                             NTMinerConsole.UserWarn("应用超频,如果CPU性能较差耗时可能超过1分钟,请耐心等待");
                             var cmd = new CoinOverClockCommand(coinId: MainCoin.GetId());
-                            AddOnecePath<CoinOverClockDoneEvent>("超频完成后继续流程", LogEnum.DevConsole,
+                            AddOnecePath<CoinOverClockDoneEvent>("超频完成后继续流程", LogEnum.DevConsole, pathId: cmd.MessageId, location: this.GetType(),
                                 message => {
                                     // pathId是唯一的,从而可以断定该消息一定是因为该命令而引发的
                                     ContinueCreateProcess();
-                                }, location: this.GetType(), pathId: cmd.MessageId);
+                                });
                             // 超频是在另一个线程执行的,因为N卡超频当cpu性能非常差时较耗时
                             VirtualRoot.Execute(cmd);
                         }
@@ -287,8 +287,8 @@ namespace NTMiner.Mine {
                 return;
             }
             string processName = this.Kernel.GetProcessName();
-            this.AddEventPath<Per1MinuteEvent>("周期性检查挖矿内核是否消失,如果消失尝试重启", LogEnum.DevConsole,
-                action: message => {
+            this.AddEventPath<Per1MinuteEvent>("周期性检查挖矿内核是否消失,如果消失尝试重启", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
+                path: message => {
                     if (this == NTMinerContext.Instance.LockedMineContext) {
                         if (!string.IsNullOrEmpty(processName)) {
                             Process[] processes = Process.GetProcessesByName(processName);
@@ -308,7 +308,7 @@ namespace NTMiner.Mine {
                     else {
                         this.Close();
                     }
-                }, location: this.GetType());
+                });
         }
         #endregion
 

+ 17 - 17
src/NTMinerClient/NTMinerContext.cs

@@ -32,18 +32,18 @@ namespace NTMiner {
             if (ClientAppType.IsMinerClient) {
                 SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
 
-                VirtualRoot.BuildEventPath<UserActionEvent>("发生了用户活动时检查serverJson是否有新版本", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<UserActionEvent>("发生了用户活动时检查serverJson是否有新版本", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         RefreshServerJsonFile();
-                    }, location: this.GetType());
+                    });
             }
-            VirtualRoot.BuildEventPath<AppExitEvent>($"程序退出时的{nameof(NTMinerContext)}退出逻辑", LogEnum.None,
+            VirtualRoot.BuildEventPath<AppExitEvent>($"程序退出时的{nameof(NTMinerContext)}退出逻辑", LogEnum.None, typeof(NTMinerContext), PathPriority.Normal,
                 message => {
                     if (LockedMineContext != null) {
                         StopMine(StopMineReason.ApplicationExit);
                     }
                     SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch;
-                }, typeof(NTMinerContext));
+                });
         }
 
         private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e) {
@@ -219,7 +219,7 @@ namespace NTMiner {
         }
 
         private void Link() {
-            VirtualRoot.BuildCmdPath<RegCmdHereCommand>(path: message => {
+            VirtualRoot.BuildCmdPath<RegCmdHereCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 try {
                     Cmd.RegCmdHere();
                     VirtualRoot.ThisLocalInfo(nameof(NTMinerContext), "添加windows右键命令行成功");
@@ -228,8 +228,8 @@ namespace NTMiner {
                     Logger.ErrorDebugLine(e);
                     VirtualRoot.ThisLocalError(nameof(NTMinerContext), "添加windows右键命令行失败", OutEnum.Warn);
                 }
-            }, location: this.GetType());
-            VirtualRoot.BuildCmdPath<UnRegCmdHereCommand>(path: message => {
+            });
+            VirtualRoot.BuildCmdPath<UnRegCmdHereCommand>(location: this.GetType(), LogEnum.DevConsole, path: message => {
                 try {
                     Cmd.UnRegCmdHere();
                     VirtualRoot.ThisLocalInfo(nameof(NTMinerContext), "移除windows右键命令行成功");
@@ -238,17 +238,17 @@ namespace NTMiner {
                     Logger.ErrorDebugLine(e);
                     VirtualRoot.ThisLocalError(nameof(NTMinerContext), "移除windows右键命令行失败", OutEnum.Warn);
                 }
-            }, location: this.GetType());
-            VirtualRoot.BuildEventPath<Per1MinuteEvent>("每1分钟阻止系统休眠", LogEnum.None,
+            });
+            VirtualRoot.BuildEventPath<Per1MinuteEvent>("每1分钟阻止系统休眠", LogEnum.None, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     Power.PreventSleep(MinerProfile.IsPreventDisplaySleep);
-                }, location: this.GetType());
+                });
             #region 挖矿开始时将无份额内核重启份额计数置0
             int shareCount = 0;
             DateTime shareOn = DateTime.Now;
             DateTime highSpeedOn = DateTime.Now;
             DateTime overClockHighSpeedOn = DateTime.Now;
-            VirtualRoot.BuildEventPath<MineStartedEvent>("挖矿开始后将无份额内核重启份额计数置0", LogEnum.DevConsole,
+            VirtualRoot.BuildEventPath<MineStartedEvent>("挖矿开始后将无份额内核重启份额计数置0", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     // 将无份额内核重启份额计数置0
                     shareCount = 0;
@@ -258,10 +258,10 @@ namespace NTMiner {
                         // 当不是内核重启时更新shareOn,如果是内核重启不用更新shareOn从而给不干扰无内核矿机重启的逻辑
                         shareOn = DateTime.Now;
                     }
-                }, location: this.GetType());
+                });
             #endregion
             #region 每20秒钟检查是否需要重启
-            VirtualRoot.BuildEventPath<Per20SecondEvent>("每20秒钟检查是否需要重启", LogEnum.None,
+            VirtualRoot.BuildEventPath<Per20SecondEvent>("每20秒钟检查是否需要重启", LogEnum.None, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     #region 低算力重启电脑
                     if (IsMining && LockedMineContext.ProcessCreatedOn != DateTime.MinValue) {
@@ -357,7 +357,7 @@ namespace NTMiner {
                     try {
                         if (IsMining && this.LockedMineContext.MainCoin != null) {
                             int totalShare = 0;
-                            bool restartComputer = MinerProfile.NoShareRestartComputerMinutes >0 && MinerProfile.IsNoShareRestartComputer && (DateTime.Now - shareOn).TotalMinutes > MinerProfile.NoShareRestartComputerMinutes;
+                            bool restartComputer = MinerProfile.NoShareRestartComputerMinutes > 0 && MinerProfile.IsNoShareRestartComputer && (DateTime.Now - shareOn).TotalMinutes > MinerProfile.NoShareRestartComputerMinutes;
                             bool restartKernel = MinerProfile.NoShareRestartKernelMinutes > 0 && MinerProfile.IsNoShareRestartKernel && (DateTime.Now - shareOn).TotalMinutes > MinerProfile.NoShareRestartKernelMinutes;
                             if (restartComputer || restartKernel) {
                                 ICoinShare mainCoinShare = this.CoinShareSet.GetOrCreate(this.LockedMineContext.MainCoin.GetId());
@@ -399,15 +399,15 @@ namespace NTMiner {
                         Logger.ErrorDebugLine(e);
                     }
                     #endregion
-                }, location: this.GetType());
+                });
             #endregion
-            VirtualRoot.BuildEventPath<Per10SecondEvent>("周期刷新显卡状态", LogEnum.None,
+            VirtualRoot.BuildEventPath<Per10SecondEvent>("周期刷新显卡状态", LogEnum.None, location: this.GetType(), PathPriority.Normal,
                 path: message => {
                     // 因为遇到显卡系统状态变更时可能费时
                     Task.Factory.StartNew(() => {
                         GpuSet.LoadGpuState();
                     });
-                }, location: this.GetType());
+                });
         }
         private DateTime GetKernelRestartBaseOnTime() {
             if (LockedMineContext == null) {

+ 8 - 8
src/NTMinerClient/Report/ReportDataProvider.cs

@@ -11,13 +11,13 @@ namespace NTMiner.Report {
     public class ReportDataProvider : IReportDataProvider {
         public ReportDataProvider() {
             if (ClientAppType.IsMinerClient) {
-                VirtualRoot.BuildOnecePath<HasBoot5SecondEvent>("登录服务器并报告一次0算力", LogEnum.DevConsole,
+                VirtualRoot.BuildOnecePath<HasBoot5SecondEvent>("登录服务器并报告一次0算力", LogEnum.DevConsole, pathId: PathId.Empty, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         // 报告0算力从而告知服务器该客户端当前在线的币种
                         ReportSpeed();
-                    }, location: this.GetType(), pathId: PathId.Empty);
+                    });
 
-                VirtualRoot.BuildEventPath<Per2MinuteEvent>("每两分钟上报一次", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<Per2MinuteEvent>("每两分钟上报一次", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         // 如果服务端通过Ws通道最近获取过算力就不用上报算力了,因为获取的算力会通过Mq走内网传播给这里上报的目的服务器,
                         // 而Daemon进程也会每2分钟周期走Ws通道上报一次算力,从而结果就是优先使用Ws通道上报算力,只要Ws通道在周期地上报
@@ -26,17 +26,17 @@ namespace NTMiner.Report {
                             return;
                         }
                         ReportSpeed();
-                    }, location: this.GetType());
+                    });
 
-                VirtualRoot.BuildEventPath<MineStartedEvent>("开始挖矿后报告状态", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<MineStartedEvent>("开始挖矿后报告状态", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         ReportSpeed();
-                    }, location: this.GetType());
+                    });
 
-                VirtualRoot.BuildEventPath<MineStopedEvent>("停止挖矿后报告状态", LogEnum.DevConsole,
+                VirtualRoot.BuildEventPath<MineStopedEvent>("停止挖矿后报告状态", LogEnum.DevConsole, location: this.GetType(), PathPriority.Normal,
                     path: message => {
                         RpcRoot.OfficialServer.ReportService.ReportStateAsync(NTMinerContext.Id, isMining: false);
-                    }, location: this.GetType());
+                    });
             }
         }
 

+ 2 - 2
src/NTMinerDaemon/Core/Impl/OperationResultSet.cs

@@ -11,7 +11,7 @@ namespace NTMiner.Core.Impl {
         private readonly List<OperationResultData> _list = new List<OperationResultData>();
 
         public OperationResultSet() {
-            VirtualRoot.BuildEventPath<Per24HourEvent>("检查一下记录的操作记录是否多于容量,如果多了清理一下", LogEnum.DevConsole, path: message => {
+            VirtualRoot.BuildEventPath<Per24HourEvent>("检查一下记录的操作记录是否多于容量,如果多了清理一下", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                 using (var db = VirtualRoot.CreateLocalDb()) {
                     var col = db.GetCollection<OperationResultData>();
                     int count = col.Count();
@@ -27,7 +27,7 @@ namespace NTMiner.Core.Impl {
                         col.Delete(all[i].Id);
                     }
                 }
-            }, this.GetType());
+            });
         }
 
         protected override void Init() {

+ 8 - 8
src/NTMinerDaemon/Ws/AbstractWsClient.cs

@@ -76,12 +76,12 @@ namespace NTMiner.Ws {
         public AbstractWsClient(NTMinerAppType appType) {
             _appType = appType;
             _clientId = NTMinerRegistry.GetClientId(appType);
-            VirtualRoot.BuildEventPath<Per1SecondEvent>("重试Ws连接的秒表倒计时", LogEnum.None, path: message => {
+            VirtualRoot.BuildEventPath<Per1SecondEvent>("重试Ws连接的秒表倒计时", LogEnum.None, typeof(VirtualRoot), PathPriority.Normal, path: message => {
                 if (_nextTrySecondsDelay > 0) {
                     _nextTrySecondsDelay--;
                 }
-            }, typeof(VirtualRoot));
-            VirtualRoot.BuildEventPath<Per10SecondEvent>("周期检查Ws连接", LogEnum.None,
+            });
+            VirtualRoot.BuildEventPath<Per10SecondEvent>("周期检查Ws连接", LogEnum.None, typeof(VirtualRoot), PathPriority.Normal,
                 path: message => {
                     if (_ws == null || _ws.ReadyState != WebSocketState.Open) {
                         if (_continueCount >= _failConnCount) {
@@ -92,9 +92,9 @@ namespace NTMiner.Ws {
                             _continueCount++;
                         }
                     }
-                }, typeof(VirtualRoot));
+                });
             // 20秒是个不错的值,即不太频繁,也不太少
-            VirtualRoot.BuildEventPath<Per20SecondEvent>("周期Ws Ping", LogEnum.None, path: message => {
+            VirtualRoot.BuildEventPath<Per20SecondEvent>("周期Ws Ping", LogEnum.None, typeof(VirtualRoot), PathPriority.Normal, path: message => {
                 if (_ws != null && _ws.ReadyState == WebSocketState.Open) {
                     // 或者_ws.IsAlive,因为_ws.IsAlive内部也是一个Ping,所以用Ping从而显式化这里有个网络请求
                     Task.Factory.StartNew(() => {
@@ -103,10 +103,10 @@ namespace NTMiner.Ws {
                         }
                     });
                 }
-            }, typeof(VirtualRoot));
-            VirtualRoot.BuildEventPath<AppExitEvent>("退出程序时关闭Ws连接", LogEnum.DevConsole, path: message => {
+            });
+            VirtualRoot.BuildEventPath<AppExitEvent>("退出程序时关闭Ws连接", LogEnum.DevConsole, this.GetType(), PathPriority.Normal, path: message => {
                 _ws?.CloseAsync(CloseStatusCode.Normal, "客户端程序退出");
-            }, this.GetType());
+            });
             /// 1,进程启动后第一次连接时;
             NeedReWebSocket();
             OpenOrCloseWs();

+ 2 - 2
src/NTMinerDaemon/Ws/DaemonWsClient.cs

@@ -4,7 +4,7 @@ using System;
 namespace NTMiner.Ws {
     public class DaemonWsClient : AbstractWsClient {
         public DaemonWsClient() : base(NTMinerAppType.MinerClient) {
-            VirtualRoot.BuildEventPath<Per2MinuteEvent>("每2分钟通过Ws通道上报一次算力", LogEnum.DevConsole, path: message => {
+            VirtualRoot.BuildEventPath<Per2MinuteEvent>("每2分钟通过Ws通道上报一次算力", LogEnum.DevConsole, typeof(VirtualRoot), PathPriority.Normal, path: message => {
                 if (!IsOpen) {
                     return;
                 }
@@ -20,7 +20,7 @@ namespace NTMiner.Ws {
                         Data = data
                     });
                 });
-            }, typeof(VirtualRoot));
+            });
         }
 
         protected override bool TryGetHandler(string messageType, out Action<Action<WsMessage>, WsMessage> handler) {

+ 1 - 1
src/NTMinerHub/Hub/IMessagePathHub.cs

@@ -8,7 +8,7 @@ namespace NTMiner.Hub {
     public interface IMessagePathHub {
         void Route<TMessage>(TMessage message) where TMessage : IMessage;
 
-        IMessagePathId AddPath<TMessage>(Type location, string description, LogEnum logType, Action<TMessage> action, PathId pathId, int viaTimesLimit = -1);
+        IMessagePathId AddPath<TMessage>(Type location, string description, LogEnum logType, PathId pathId, PathPriority priority, Action<TMessage> action, int viaTimesLimit = -1);
 
         void RemovePath(IMessagePathId pathId);
 

+ 1 - 0
src/NTMinerHub/Hub/IMessagePathId.cs

@@ -4,6 +4,7 @@ namespace NTMiner.Hub {
     
     public interface IMessagePathId {
         PathId PathId { get; }
+        PathPriority Priority { get; }
         DateTime CreatedOn { get; }
         /// <summary>
         /// 表示该条消息路径允许消息通过的次数

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels