private static void ActionWorkerDoWork(object sender, DoWorkEventArgs e) { const int progressBufferSize = 5; BackgroundWorker worker = (BackgroundWorker)sender; WorkerArgs args = (WorkerArgs)e.Argument; string[] allFiles = Directory.GetFiles(args.BaseDirectory, "*.*", args.IncludeSubdirectories ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); WorkerProgress[] progressBuffer = new WorkerProgress[progressBufferSize]; int reportBufferCounter = 1; IEnumerable <Regex> maskPatterns = GenerateMaskPatterns(args.FileMasks); for (int i = 0; i < allFiles.Length; i++) { if (worker.CancellationPending) { e.Cancel = true; break; } string path = allFiles[i]; string fileName = Path.GetFileName(path); if (!SatisfiesMaskPatterns(fileName, maskPatterns)) { continue; } Encoding encoding = TextEncoding.GetFileEncoding(path); string charset = encoding?.WebName ?? "(Unknown)"; if (args.Action == CurrentAction.Validate) { if (args.ValidCharsets.Contains(charset)) { continue; } } string directoryName = Path.GetDirectoryName(path); progressBuffer[reportBufferCounter - 1] = new WorkerProgress { Charset = charset, FileName = fileName, DirectoryName = directoryName }; reportBufferCounter++; if (reportBufferCounter > progressBufferSize) { reportBufferCounter = 1; int percentageCompleted = (i * 100) / allFiles.Length; WorkerProgress[] reportProgress = new WorkerProgress[progressBufferSize]; Array.Copy(progressBuffer, reportProgress, progressBufferSize); worker.ReportProgress(percentageCompleted, reportProgress); Array.Clear(progressBuffer, 0, progressBufferSize); } } // Copy remaining results from buffer, if any. if (reportBufferCounter > 1) { reportBufferCounter--; int percentageCompleted = 100; WorkerProgress[] reportProgress = new WorkerProgress[reportBufferCounter]; Array.Copy(progressBuffer, reportProgress, reportBufferCounter); worker.ReportProgress(percentageCompleted, reportProgress); Array.Clear(progressBuffer, 0, reportBufferCounter); } }