2014-10-31 2 views
0

Я знаю й линии следующаяПользовательские условия 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++) 
+0

Этот случай не распространяется. Просто выйдите из кода соответственно внутри тела функции. –

ответ

2

Похоже, что вы действительно хотите создать 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;  

}});

+0

Обратите внимание, что такой делегат 'condition' должен быть потокобезопасным, и не похоже, что это будет иметь место здесь, поскольку оно основано на текущей итерации (данные, на которые невозможно безопасно получить доступ). И если вы не знаете, будет ли еще одна итерация до завершения предыдущего, тогда нет ничего, что можно было бы распараллелить. – Servy

1

Parallel.For не предназначена для представления таких петель. Он строго предназначен для представления ряда итераций, известных с начала цикла.

Вам нужно будет вычислить количество итераций, которые потребуются до вызова Parallel.For, если вы хотите его использовать. Если вы не можете это сделать разумно, вам нужно будет использовать другое средство распараллеливания.

0

Лично я бы отделить состояние вне, таким образом

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) => { }); 
+1

Это предполагает, что значения 'x',' y' и 'z' известны до начала цикла и никогда не изменяются внутри цикла. – Servy

+0

+1 также рабочее решение – fubo

Смежные вопросы