MainForm.cs 4.8 KB

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