static void ColumnCycle(int fromInclusive, int toInclusive, int iRow, int row, int xStride, InnerCycle innerCycle) { var column = 0; for (var iColumn = fromInclusive; iColumn <= toInclusive; iColumn += xStride, column++) { innerCycle(iRow, row, iColumn, column); } }
private static void MatrixCycle(int rowFromInclusive, int rowToInclusive, int columnFromInclusive, int columnToInclusive, int yStride, int xStride, int maxDegreeOfParallelism, InnerCycle innerCycle, CancellationToken cancellationToken = default) { OutOfRangeException.Check(nameof(maxDegreeOfParallelism), maxDegreeOfParallelism, 0); var iRows = new List <int>(); for (var iRow = rowFromInclusive; iRow <= rowToInclusive; iRow += yStride) { iRows.Add(iRow); } if (maxDegreeOfParallelism > 1) { Parallel.ForEach(iRows, new ParallelOptions { MaxDegreeOfParallelism = maxDegreeOfParallelism, CancellationToken = cancellationToken }, iRow => { var row = (iRow - rowFromInclusive) / yStride; ColumnCycle(columnFromInclusive, columnToInclusive, iRow, row, xStride, innerCycle); }); } else { var row = 0; foreach (var iRow in iRows) { ColumnCycle(columnFromInclusive, columnToInclusive, iRow, row, xStride, innerCycle); row++; } }