Дмитрий ответ Быченко добудет его, но вы также можете реализовать свой собственный ParallelFor
с настраиваемым шагом, который сделает ваш код несколько более читабельным:
static void ParallelFor(int start, int last, Func<int, int> step, Action<int> action)
{
var enumerable = StepEnumerable<int>
.Create(start, step)
.TakeWhile(x => x < last);
Parallel.ForEach(enumerable, action);
}
Вот StepEnumerable
:
public class StepEnumerator<T> : IEnumerator<T>
{
...
public StepEnumerable(T value, Func<T, T> manipulation)
{
mEnumerator = new StepEnumerator<T>(value, manipulation);
}
public static StepEnumerable<T> Create(T value, Func<T, T> manipulation)
{
return new StepEnumerable<T>(value, manipulation);
}
...
}
public class StepEnumerator<T> : IEnumerator<T>
{
public bool MoveNext()
{
Current = mManipulation(Current);
return true;
}
}
Тогда, например, если выполнить следующий код:
ParallelFor(3, 16, x => x + 2, Console.WriteLine);
Вы получите следующий результат (в отдельных линиях, конечно):
5, 11, 7, 13, 9, 15
Это не делает то, что он просит. ваш код запускается для значений 5, 6, 7, 8, 9 параллельно, в то время как он хочет, чтобы он был эквивалентен циклу, который пропускает каждый второй элемент (значения: 3, 5, 7). –
Обратите внимание, что изменение 'i' внутри' делегата' не меняет счет 'Parallel.For', и это только скопированный тип значения -' int'. –
Я вижу это! вы совершенно правы. –