Из информации вы» я понял, вы хотите иметь выходной массив Foo с размером, равным входному массиву байтов? Это верно?
Если да, то операция проста. Не беспокойтесь о блокировке или синхронизированных конструкциях, это приведет к разрушению всей скорости, которую дает вам распараллеливание.
Вместо этого, если вы подчиняются этому простому правилу любой алгоритм может быть распараллелены без блокировки или синхронизации:
Для каждого входного элемента Х [я] обработан, вы можете считывать из любого входного элемента X [J], но только запись в выходной элемент Y [I]
Посмотрите Scatter/Gather, этот тип операции называется собрать как только один выходной элемент записывается.
Если вы можете использовать приведенный выше принцип, тогда вы хотите создать свой выходной массив Foo [] спереди и использовать Parallel.For not ForEach на входном массиве.
Э.Г.
List<byte[]> inputArray = new List<byte[]>();
int[] outputArray = new int[inputArray.Count];
var waitHandle = new ManualResetEvent(false);
int counter = 0;
Parallel.For(0, inputArray.Count, index =>
{
// Pass index to for loop, do long running operation
// on input items
// writing to only a single output item
outputArray[index] = DoOperation(inputArray[index]);
if(Interlocked.Increment(ref counter) == inputArray.Count -1)
{
waitHandle.Set();
}
});
waitHandler.WaitOne();
// Optional conversion back to list if you wanted this
var outputList = outputArray.ToList();
сообщения некоторых примеры код, пожалуйста, и для записей делают вещи параллельно обязательно не делают быстрее и эффективнее ... Удивление если Parallel.For решит вашу проблему. –
adt
Это дубликат из этого: http://stackoverflow.com/questions/3639768/parallel-foreach-ordered-execution Так, чтобы ответить, вы можете использовать PLINQ (AsOrdered, AsParallel), чтобы получить работу. – Kadelka
Лучше иметь параллельный эквивалент 'Select' или' Map' для сохранения порядка ввода. – leppie