Я предлагаю использовать PLINQ вместо класса Parallel
, потому что первый по своей сути способен собирать потокобезопасные обработанные результаты и возвращать их (необязательно) в исходном порядке. Это также упрощает получение индекса текущего обрабатываемого элемента с помощью перегрузки Select
, которая принимает индекс:
public static ParallelQuery<TResult> Select<TSource, TResult> (
this ParallelQuery<TSource> source,
Func<TSource, int, TResult> selector);
Пример использования:
string[] results = myFiles
.AsParallel()
.AsOrdered() // Optional, by default the original order will not be preserved
.WithDegreeOfParallelism(runParallel ? Environment.ProcessorCount : 1)
.Select((myFile, index) =>
{
var newMyFile = WorkOnMyFile(myFile, index);
return RunExeTask(newMyFile, outputDirectory, false);
}).ToArray();