Я создаю приложение для пакетной обработки изображений OCR, и сейчас я использую асинхронный метод Parallel.ForEach для итерации по списку объектов (распечаток), которые содержат поля для имени файла и текста OCR.
Интересно, так ли это лучше? Я читал о TPL.Dataflow, и, хотя он выглядит излишним, я думаю, что лучше использовать более сложный подход, поскольку я буду потенциально обрабатывать сотни файлов одновременно, и я не уверен, что сотня задач будет создана это хорошая практика. Кроме того, я читал, что это плохая практика - использовать Interlocked.Increment в Parallel.ForEach. Должен ли я конвертировать это в Parallel.For? Ниже моя текущая реализация:
private async void BatchOCR_Click(object sender, EventArgs e) {
//some UI stuff
source = new CancellationTokenSource();
progressBar.Value = 0;
int counter = 0;
IProgress<int> progress = new Progress<int>(i => { progressBar.Value = (int)Math.Round((float)(i)*100 / fileList.Items.Count, 0); });
await Task.Run(() => RunBatchOCR(ListOfPrintouts,progress,counter), source.Token);
//some UI stuff
}
private async Task RunBatchOCR(List<Printout> printouts,IProgress<int> progress, int counter) {
progress.Report(0);
Parallel.ForEach(printouts, (printout,state) =>
{
try
{
source.Token.ThrowIfCancellationRequested();
}
catch
{
Console.WriteLine("Task was cancelled");
cancelButton.Enabled = false;
state.Break();
}
finally
{
Interlocked.Increment(ref counter);
}
printout.OcrHelper.runOCR(); //loads bitmap and extracts text
progress.Report(counter);
Console.WriteLine(counter.ToString());
});
}