AppContext.partials.CoinProfileViewModels.cs 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using NTMiner.Core;
  2. using NTMiner.Vms;
  3. using System;
  4. using System.Collections.Generic;
  5. namespace NTMiner {
  6. public partial class AppContext {
  7. public class CoinProfileViewModels : ViewModelBase {
  8. public static readonly CoinProfileViewModels Instance = new CoinProfileViewModels();
  9. private readonly Dictionary<Guid, CoinKernelProfileViewModel> _coinKernelProfileDicById = new Dictionary<Guid, CoinKernelProfileViewModel>();
  10. private readonly Dictionary<Guid, CoinProfileViewModel> _coinProfileDicById = new Dictionary<Guid, CoinProfileViewModel>();
  11. private CoinProfileViewModels() {
  12. #if DEBUG
  13. Write.Stopwatch.Start();
  14. #endif
  15. BuildEventPath<CoinKernelProfilePropertyChangedEvent>("币种内核设置变更后刷新VM内存", LogEnum.DevConsole,
  16. action: message => {
  17. if (_coinKernelProfileDicById.ContainsKey(message.CoinKernelId)) {
  18. _coinKernelProfileDicById[message.CoinKernelId].OnPropertyChanged(message.PropertyName);
  19. }
  20. });
  21. BuildEventPath<CoinProfilePropertyChangedEvent>("币种设置变更后刷新VM内存", LogEnum.DevConsole,
  22. action: message => {
  23. if (_coinProfileDicById.ContainsKey(message.CoinId)) {
  24. _coinProfileDicById[message.CoinId].OnPropertyChanged(message.PropertyName);
  25. }
  26. });
  27. VirtualRoot.AddEventPath<LocalContextReInitedEvent>("LocalContext刷新后刷新VM内存", LogEnum.DevConsole,
  28. action: message => {
  29. _coinKernelProfileDicById.Clear();
  30. _coinProfileDicById.Clear();
  31. });
  32. #if DEBUG
  33. var elapsedMilliseconds = Write.Stopwatch.Stop();
  34. if (elapsedMilliseconds.ElapsedMilliseconds > NTStopwatch.ElapsedMilliseconds) {
  35. Write.DevTimeSpan($"耗时{elapsedMilliseconds} {this.GetType().Name}.ctor");
  36. }
  37. #endif
  38. }
  39. private readonly object _coinProfileDicLocker = new object();
  40. public CoinProfileViewModel GetOrCreateCoinProfile(Guid coinId) {
  41. CoinProfileViewModel coinProfile;
  42. if (!_coinProfileDicById.TryGetValue(coinId, out coinProfile)) {
  43. lock (_coinProfileDicLocker) {
  44. if (!_coinProfileDicById.TryGetValue(coinId, out coinProfile)) {
  45. coinProfile = new CoinProfileViewModel(NTMinerRoot.Instance.MinerProfile.GetCoinProfile(coinId));
  46. _coinProfileDicById.Add(coinId, coinProfile);
  47. }
  48. }
  49. }
  50. return coinProfile;
  51. }
  52. private readonly object _coinKernelProfileLocker = new object();
  53. public CoinKernelProfileViewModel GetOrCreateCoinKernelProfileVm(Guid coinKernelId) {
  54. CoinKernelProfileViewModel coinKernelProfileVm;
  55. if (!_coinKernelProfileDicById.TryGetValue(coinKernelId, out coinKernelProfileVm)) {
  56. lock (_coinKernelProfileLocker) {
  57. if (!_coinKernelProfileDicById.TryGetValue(coinKernelId, out coinKernelProfileVm)) {
  58. coinKernelProfileVm = new CoinKernelProfileViewModel(NTMinerRoot.Instance.MinerProfile.GetCoinKernelProfile(coinKernelId));
  59. _coinKernelProfileDicById.Add(coinKernelId, coinKernelProfileVm);
  60. }
  61. }
  62. }
  63. return coinKernelProfileVm;
  64. }
  65. }
  66. }
  67. }