Как мне выйти из цикла parallel.for ?
У меня есть довольно сложное утверждение, которое выглядит следующим образом:
Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
new Action<ColorIndexHolder>((ColorIndexHolder Element) =>
{
if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
{
Found = true;
break;
}
}));
Используя параллельный класс, я могу значительно оптимизировать этот процесс. Тем не мение; Не могу понять, как разорвать параллельный цикл? Этот break;
оператор выдает следующую синтаксическую ошибку:
Нет замыкающих петель, из которых можно было бы разорвать или продолжить
c#
multithreading
parallel-processing
parallel.foreach
Расмус Сёборг
источник
источник
Ответы:
Используйте
ParallelLoopState.Break
метод:Или в вашем случае:
источник
Calling the Break method informs the for operation that iterations after the current one don't have to execute. However, all iterations before the current one will still have to be executed if they haven't already.
иthere is no guarantee that iterations after the current one will definitely not execute.
state.Stop()
бы более подходящим для надежного достижения ожидаемых результатов, как указано ниже Майком Перренудом и MBentleyВы делаете это, вызывая с помощью перегрузки
Parallel.For
или,Parallel.ForEach
которая переходит в состояние цикла, а затем вызываяParallelLoopState.Break
илиParallelLoopState.Stop
. Основное различие заключается в том, как быстро все прерывается -Break()
цикл будет обрабатывать все элементы с более ранним "индексом", чем текущий. СStop()
, он выйдет как можно быстрее.Дополнительные сведения см. В разделе Практическое руководство. Остановить параллельный цикл или выйти из него .
источник
Вы должны использовать
Any
, а не цикл foreach:Any
достаточно умен, чтобы остановиться, как только узнает, что результат должен быть верным.источник
LoopState, безусловно, отличный ответ. Я обнаружил, что в предыдущих ответах было так много другого материала, что было трудно увидеть ответ, поэтому вот простой случай:
источник
Просто используйте то,
loopState
что может быть предоставлено.Взгляните на эту статью MSDN для примера.
источник