MainForm.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. using Microsoft.VisualBasic.Logging;
  2. using SnapshotWinFormsApp.Application;
  3. using SnapshotWinFormsApp.Application.Dtos;
  4. using SnapshotWinFormsApp.Application.Interfaces;
  5. using SnapshotWinFormsApp.Repository;
  6. using SnapshotWinFormsApp.Repository.Enum;
  7. using SnapshotWinFormsApp.Tools;
  8. using SqlSugar;
  9. using System.ComponentModel;
  10. using System.Configuration;
  11. using System.Globalization;
  12. using System.Reflection;
  13. namespace SnapshotWinFormsApp;
  14. public partial class MainForm : Form
  15. {
  16. private readonly DbSqlServer _sqlServerDB;
  17. private CancellationTokenSource? _cts;
  18. private EButtonStatusType _startButtonStatus;
  19. public static ManualResetEventSlim _pauseEvent = new ManualResetEventSlim(true);
  20. public MainForm(DbSqlServer dbSqlServer)
  21. {
  22. _startButtonStatus = EButtonStatusType.Start;
  23. _sqlServerDB = dbSqlServer;
  24. InitializeComponent();
  25. LoadCheckBox();
  26. LoadCityName();
  27. logTxt.AppendText("初始化完成\r\n");
  28. logTxt.AppendText("日志文件夹:" + Logs.Path() + "\r\n");
  29. startTimePicker.Format = DateTimePickerFormat.Custom;
  30. startTimePicker.CustomFormat = "yyyy年MM月dd日";
  31. endTimePicker.Format = DateTimePickerFormat.Custom;
  32. endTimePicker.CustomFormat = "yyyy年MM月dd日";
  33. }
  34. private void LoadCityName()
  35. {
  36. cityNameCbox.DataSource = ConfigurationManager.ConnectionStrings
  37. .Cast<ConnectionStringSettings>()
  38. .Where(setting => !string.IsNullOrEmpty(setting.ProviderName) && setting.ProviderName.Length < 8)
  39. .Select(setting => setting.ProviderName)
  40. .ToHashSet()
  41. .ToList<string>();
  42. cityNameCbox.DropDownStyle = ComboBoxStyle.DropDownList;
  43. }
  44. private void LoadCheckBox()
  45. {
  46. var types = Assembly.GetExecutingAssembly()
  47. .GetTypes()
  48. .Where(t => t.IsClass && t.Name.StartsWith("ImportApplicationBase") == false && !t.IsAbstract && typeof(IImportApplication).IsAssignableFrom(t))
  49. .ToList();
  50. int rowIndex = 3;
  51. int colIndex = 0;
  52. foreach (var type in types)
  53. {
  54. var descriptionAttr = type.GetCustomAttribute<DescriptionAttribute>();
  55. string description = descriptionAttr?.Description ?? type.Name;
  56. CheckBox checkBox = new CheckBox
  57. {
  58. Text = description,
  59. Tag = type,
  60. AutoSize = true
  61. };
  62. if (tableLayoutPanel1.RowCount <= rowIndex)
  63. {
  64. tableLayoutPanel1.RowCount = rowIndex + 1;
  65. tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize));
  66. }
  67. tableLayoutPanel1.Controls.Add(checkBox, colIndex, rowIndex);
  68. colIndex++;
  69. if (colIndex > 1)
  70. {
  71. colIndex = 0;
  72. rowIndex++;
  73. }
  74. }
  75. }
  76. private async void OkBtn_Click(object sender, EventArgs e)
  77. {
  78. if (_startButtonStatus == EButtonStatusType.Start)
  79. {
  80. _startButtonStatus = EButtonStatusType.Pause;
  81. OkBtn.Text = "暂停";
  82. _cts = new CancellationTokenSource();
  83. var tasks = new List<Task>();
  84. foreach (var control in tableLayoutPanel1.Controls)
  85. {
  86. if (control is CheckBox checkBox && checkBox.Checked)
  87. {
  88. AddLog($"初始化任务 [{checkBox.Text}]...");
  89. Type type = (Type)checkBox.Tag;
  90. if (Activator.CreateInstance(type, new CreateInstanceInDto(_sqlServerDB, cityNameCbox.SelectedItem.ToString(), startTimePicker.Value, endTimePicker.Value, keyTxt.Text)) is IImportApplication instance)
  91. {
  92. tasks.Add(RunImport(instance, _cts.Token));
  93. }
  94. }
  95. }
  96. try
  97. {
  98. await Task.WhenAll(tasks);
  99. AddLog("所有任务完成");
  100. OkBtn.Text = "开始";
  101. _startButtonStatus = EButtonStatusType.Start;
  102. }
  103. catch (OperationCanceledException)
  104. {
  105. AddLog("任务已取消");
  106. OkBtn.Text = "开始";
  107. _startButtonStatus = EButtonStatusType.Start;
  108. }
  109. return;
  110. }
  111. if (_startButtonStatus == EButtonStatusType.Pause)
  112. {
  113. _startButtonStatus = EButtonStatusType.Wait;
  114. OkBtn.Text = "继续";
  115. _pauseEvent.Reset();
  116. return;
  117. }
  118. if (_startButtonStatus == EButtonStatusType.Wait)
  119. {
  120. _startButtonStatus = EButtonStatusType.Pause;
  121. OkBtn.Text = "暂停";
  122. _pauseEvent.Set();
  123. return;
  124. }
  125. }
  126. private async Task RunImport(IImportApplication instance, CancellationToken token)
  127. {
  128. await instance.ImportAsync(AddLog, token);
  129. }
  130. private void AddLog(string msg)
  131. {
  132. this.Invoke((EventHandler)delegate
  133. {
  134. this.logTxt.AppendText(msg + "\r\n");
  135. Logs.Note(msg);
  136. });
  137. }
  138. private void CancelBtn_Click(object sender, EventArgs e)
  139. {
  140. _cts?.Cancel();
  141. }
  142. }