private void InitializeBindings() { ViewModel = new VM_Work(); data = new DataTable(); data.Columns.Add(); dgvLog.DataSource = new BindingSource { DataSource = data }; Timer timer = new Timer(); timer.Interval = 20; timer.Enabled = true; timer.Tick += (o, ev) => { pgStatus.Maximum = ViewModel.pgBarState.Maximum; pgStatus.Minimum = ViewModel.pgBarState.Minimum; pgStatus.Value = ViewModel.pgBarState.Value; pgStatus.Style = ViewModel.pgBarState.UnknownValue ? ProgressBarStyle.Marquee : ProgressBarStyle.Blocks; lblStatus.Text = ViewModel.LabelStatus; for (int records = 0; records < recordsPerTick; records++) { if (!ViewModel.Log.TryDequeue(out string message)) { break; } data.Rows.Add(message); } }; timer.Start(); }
public async void Convert(VM_Main vmMain, VM_Work vmWork) { var files = Directory.GetFiles(vmMain.PathToInputDirectory, extension).ToList(); string outputPath = Path.Combine(vmMain.PathToInputDirectory, outputDirectory); if (!Directory.Exists(outputPath)) { Directory.CreateDirectory(outputPath); } int filesProcessed = 0; vmWork.pgBarState.Maximum = files.Count; string search = vmMain.Search; getAttributeToSearch(ref search, out string attributeToSearch); Regex regex = vmMain.UseRegularExpressions ? new Regex(search, RegexOptions.Compiled) : null; String replace = vmMain.NeedReplace ? (vmMain.Replace ?? "") : null; vmWork.Log.TryAdd($"Входная директория: {vmMain.PathToInputDirectory}"); vmWork.Log.TryAdd($"Выходная директория: {outputPath}"); if (vmMain.UseXSD) { vmWork.Log.TryAdd($"XSD схема для проверки: {vmMain.PathToXSD}"); } vmWork.Log.TryAdd(logSearchLine(vmMain.UseRegularExpressions, search, attributeToSearch)); if (vmMain.NeedReplace) { vmWork.Log.TryAdd($"Заменять на: {vmMain.Replace}"); } Stopwatch elapsedTotal = Stopwatch.StartNew(); List <Task> tasks = new List <Task>(); foreach (var file in files) { var task = Task.Factory.StartNew(() => { string filename = Path.GetFileName(file) ?? throw new ArgumentException("Can't get short path for: " + file); Stopwatch elapsed = Stopwatch.StartNew(); try { XmlDocument xml = new XmlDocument(); xml.Load(file); if (vmMain.UseXSD) { xml.Schemas.Add(null, vmMain.PathToXSD); } if (!ValidateXSD(xml)) { vmWork.Log.TryAdd("ОШИБКА: Документ не соответствует XSD схеме"); goto method_end; } var result = Search(xml, vmMain.XPath, search, regex, attributeToSearch); vmWork.Log.TryAdd($"Найдено {result.Item1} значений в документе"); if (vmMain.NeedReplace) { Replace(xml, result.Item2, search, replace, regex); if (!ValidateXSD(xml)) { vmWork.Log.TryAdd("ОШИБКА: После замены документ не соответствует XSD схеме"); goto method_end; } xml.Save(Path.Combine(outputPath, filename)); } method_end:; } catch (XmlException ex) { vmWork.Log.TryAdd($"ОШИБКА: {ex.Message} в документе {filename}"); } vmWork.Log.TryAdd($"Документ \"{filename}\" обработан за {elapsed.Elapsed}ms"); vmWork.pgBarState.Value = Interlocked.Increment(ref filesProcessed); vmWork.LabelStatus = $"Обработано документов: {vmWork.pgBarState.Value}/{vmWork.pgBarState.Maximum} (через {TaskScheduler.Current.GetType().Name})"; }); tasks.Add(task); } await Task.WhenAll(tasks.ToArray()); elapsedTotal.Stop(); vmWork.Log.TryAdd($"Суммарное время обработки {files.Count} документов: {elapsedTotal.Elapsed}"); }