Я знаю й линии следующаяПользовательские условия Parallel.For
System.Threading.Tasks.Parallel.For(0, 5, (j, u) => {});
равна
for (int j = 0; j < 5; j++){}
но что параллельный код для
for (int i = 0; (i < x + y && i < z); i++)
Я знаю й линии следующаяПользовательские условия Parallel.For
System.Threading.Tasks.Parallel.For(0, 5, (j, u) => {});
равна
for (int j = 0; j < 5; j++){}
но что параллельный код для
for (int i = 0; (i < x + y && i < z); i++)
Похоже, что вы действительно хотите создать Parallel.While, которого нет. Вы можете приближать функциональность, используя что-то вроде этого:
public static void While(
ParallelOptions parallelOptions, Func<bool> condition,
Action<ParallelLoopState> body)
{
Parallel.ForEach(new InfinitePartitioner(), parallelOptions,
(ignored, loopState) =>
{
if (condition()) body(loopState));
else loopState.Stop();
});
}
Стивен Toub имеет блог об этом on MSDN
Редактировать: Просто бросить еще один вариант, вы можете также использовать LoopState, чтобы вырваться из Параллельный цикл основан на нашем условии. Что-то вроде этого (псевдо код из here:
Parallel.For (0, п, (я, loopState) => {
// ...
если ((я <! х + у & &> я < г))
{loopState.Break(); return;
}});
Обратите внимание, что такой делегат 'condition' должен быть потокобезопасным, и не похоже, что это будет иметь место здесь, поскольку оно основано на текущей итерации (данные, на которые невозможно безопасно получить доступ). И если вы не знаете, будет ли еще одна итерация до завершения предыдущего, тогда нет ничего, что можно было бы распараллелить. – Servy
Parallel.For
не предназначена для представления таких петель. Он строго предназначен для представления ряда итераций, известных с начала цикла.
Вам нужно будет вычислить количество итераций, которые потребуются до вызова Parallel.For
, если вы хотите его использовать. Если вы не можете это сделать разумно, вам нужно будет использовать другое средство распараллеливания.
Лично я бы отделить состояние вне, таким образом
for (int i = x; (i < x + y && i < z); i++)
Становится
int n = z < x + y ? x + y : z;
System.Threading.Tasks.Parallel.For(x, n, (i) => { });
Этот случай не распространяется. Просто выйдите из кода соответственно внутри тела функции. –