Dmitry câu trả lời Bychenko 's nhận được nó nhưng bạn cũng có thể thực hiện riêng bạn ParallelFor
với bước tùy chỉnh mà sẽ làm cho mã của bạn một chút dễ đọc hơn:
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);
}
Đây là Triển khai của 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;
}
}
Sau đó, ví dụ: bạn chạy đoạn mã sau:
ParallelFor(3, 16, x => x + 2, Console.WriteLine);
Bạn sẽ nhận được đầu ra sau (Trong dòng riêng biệt tất nhiên):
5, 11, 7, 13, 9, 15
Nguồn
2016-12-04 07:21:25
Điều này không làm những gì anh ta hỏi. mã của bạn chạy cho các giá trị 5, 6, 7, 8, 9 song song, trong khi anh ta muốn nó tương đương với vòng lặp bỏ qua mọi mục thứ hai (giá trị: 3, 5, 7). –
Lưu ý rằng việc thay đổi 'i' bên trong' delegate' không thay đổi số 'Parallel.For' và nó chỉ là một kiểu giá trị được sao chép -' int'. –
Tôi thấy điều đó! bạn hoàn toàn đúng. –