using Microsoft.VisualBasic.Logging; using SnapshotWinFormsApp.Application; using SnapshotWinFormsApp.Application.Dtos; using SnapshotWinFormsApp.Application.Interfaces; using SnapshotWinFormsApp.Repository; using SnapshotWinFormsApp.Repository.Enum; using SnapshotWinFormsApp.Tools; using SqlSugar; using System.ComponentModel; using System.Configuration; using System.Globalization; using System.Reflection; namespace SnapshotWinFormsApp; public partial class MainForm : Form { private readonly DbSqlServer _sqlServerDB; private CancellationTokenSource? _cts; private EButtonStatusType _startButtonStatus; public static ManualResetEventSlim _pauseEvent = new ManualResetEventSlim(true); public MainForm(DbSqlServer dbSqlServer) { _startButtonStatus = EButtonStatusType.Start; _sqlServerDB = dbSqlServer; InitializeComponent(); LoadCheckBox(); LoadCityName(); logTxt.AppendText("初始化完成\r\n"); logTxt.AppendText("日志文件夹:" + Logs.Path() + "\r\n"); startTimePicker.Format = DateTimePickerFormat.Custom; startTimePicker.CustomFormat = "yyyy年MM月dd日"; endTimePicker.Format = DateTimePickerFormat.Custom; endTimePicker.CustomFormat = "yyyy年MM月dd日"; } private void LoadCityName() { cityNameCbox.DataSource = ConfigurationManager.ConnectionStrings .Cast() .Where(setting => !string.IsNullOrEmpty(setting.ProviderName) && setting.ProviderName.Length < 8) .Select(setting => setting.ProviderName) .ToHashSet() .ToList(); cityNameCbox.DropDownStyle = ComboBoxStyle.DropDownList; } private void LoadCheckBox() { var types = Assembly.GetExecutingAssembly() .GetTypes() .Where(t => t.IsClass && t.Name.StartsWith("ImportApplicationBase") == false && !t.IsAbstract && typeof(IImportApplication).IsAssignableFrom(t)) .ToList(); int rowIndex = 3; int colIndex = 0; foreach (var type in types) { var descriptionAttr = type.GetCustomAttribute(); string description = descriptionAttr?.Description ?? type.Name; CheckBox checkBox = new CheckBox { Text = description, Tag = type, AutoSize = true }; if (tableLayoutPanel1.RowCount <= rowIndex) { tableLayoutPanel1.RowCount = rowIndex + 1; tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize)); } tableLayoutPanel1.Controls.Add(checkBox, colIndex, rowIndex); colIndex++; if (colIndex > 1) { colIndex = 0; rowIndex++; } } } private async void OkBtn_Click(object sender, EventArgs e) { if (_startButtonStatus == EButtonStatusType.Start) { _startButtonStatus = EButtonStatusType.Pause; OkBtn.Text = "暂停"; _cts = new CancellationTokenSource(); var tasks = new List(); foreach (var control in tableLayoutPanel1.Controls) { if (control is CheckBox checkBox && checkBox.Checked) { AddLog($"初始化任务 [{checkBox.Text}]..."); Type type = (Type)checkBox.Tag; if (Activator.CreateInstance(type, new CreateInstanceInDto(_sqlServerDB, cityNameCbox.SelectedItem.ToString(), startTimePicker.Value, endTimePicker.Value, keyTxt.Text)) is IImportApplication instance) { tasks.Add(RunImport(instance, _cts.Token)); } } } try { await Task.WhenAll(tasks); AddLog("所有任务完成"); OkBtn.Text = "开始"; _startButtonStatus = EButtonStatusType.Start; } catch (OperationCanceledException) { AddLog("任务已取消"); OkBtn.Text = "开始"; _startButtonStatus = EButtonStatusType.Start; } return; } if (_startButtonStatus == EButtonStatusType.Pause) { _startButtonStatus = EButtonStatusType.Wait; OkBtn.Text = "继续"; _pauseEvent.Reset(); return; } if (_startButtonStatus == EButtonStatusType.Wait) { _startButtonStatus = EButtonStatusType.Pause; OkBtn.Text = "暂停"; _pauseEvent.Set(); return; } } private async Task RunImport(IImportApplication instance, CancellationToken token) { await instance.ImportAsync(AddLog, token); } private void AddLog(string msg) { this.Invoke((EventHandler)delegate { this.logTxt.AppendText(msg + "\r\n"); Logs.Note(msg); }); } private void CancelBtn_Click(object sender, EventArgs e) { _cts?.Cancel(); } }