Como faço para sair de um loop parallel.for ?
Eu tenho uma declaração bastante complexa que se parece com o seguinte:
Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
new Action<ColorIndexHolder>((ColorIndexHolder Element) =>
{
if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
{
Found = true;
break;
}
}));
Usando a classe paralela, posso otimizar esse processo de longe. Contudo; Não consigo descobrir como quebrar o loop paralelo? A break;
instrução gera o seguinte erro de sintaxe:
Sem loops delimitadores dos quais quebrar ou continuar
c#
multithreading
parallel-processing
parallel.foreach
Rasmus Søborg
fonte
fonte
Respostas:
Use o
ParallelLoopState.Break
método:Ou no seu caso:
fonte
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.
ethere is no guarantee that iterations after the current one will definitely not execute.
state.Stop()
mais apropriado atingir os resultados esperados de forma confiável, conforme mencionado abaixo por Mike Perrenoud e MBentleyVocê faz isso chamando usando a sobrecarga de
Parallel.For
ouParallel.ForEach
que passa em um estado de loop e chamandoParallelLoopState.Break
ouParallelLoopState.Stop
. A principal diferença é a rapidez com que as coisas são interrompidas - comBreak()
o loop processará todos os itens com um "índice" anterior ao atual. ComStop()
, ele sairá o mais rápido possível.Para obter detalhes, consulte How to: Stop or Break from a Parallel.For Loop .
fonte
O que você deve usar é
Any
, em vez de um loop foreach:Any
é inteligente o suficiente para parar assim que souber que o resultado deve ser verdadeiro.fonte
LoopState é certamente uma ótima resposta. Descobri que as respostas anteriores tinham tantas outras coisas que era difícil ver a resposta, então aqui está um caso simples:
fonte
Basta usar o
loopState
que pode ser fornecido.Veja um exemplo neste artigo do MSDN .
fonte