¿Cómo salgo de un ciclo for paralelo ?
Tengo una declaración bastante compleja que se parece a la siguiente:
Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
new Action<ColorIndexHolder>((ColorIndexHolder Element) =>
{
if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
{
Found = true;
break;
}
}));
Usando la clase paralela, puedo optimizar este proceso por mucho. Sin embargo; ¿No puedo averiguar cómo romper el bucle paralelo? La break;
declaración arroja el siguiente error de sintaxis:
Sin bucles de cierre de los cuales romper o continuar
c#
multithreading
parallel-processing
parallel.foreach
Rasmus Søborg
fuente
fuente
Respuestas:
Usa el
ParallelLoopState.Break
método:O en tu caso:
fuente
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.
ythere is no guarantee that iterations after the current one will definitely not execute.
state.Stop()
más apropiado lograr de manera confiable los resultados esperados, como lo mencionan a continuación Mike Perrenoud y MBentleyPara hacer esto, llame usando la sobrecarga de
Parallel.For
oParallel.ForEach
que pasa en un estado de bucle, luego llame aParallelLoopState.Break
oParallelLoopState.Stop
. La principal diferencia está en la rapidez con la que se rompen las cosas: conBreak()
el ciclo, el ciclo procesará todos los elementos con un "índice" anterior al actual. ConStop()
, saldrá lo más rápido posible.Para obtener más información, consulte Cómo: detener o romper un bucle paralelo .
fuente
Lo que debería usar es
Any
, en lugar de un bucle foreach:Any
es lo suficientemente inteligente como para detenerse tan pronto como sepa que el resultado debe ser cierto.fuente
LoopState es sin duda una gran respuesta. Descubrí que las respuestas anteriores tenían muchas otras cosas que era difícil ver la respuesta, así que aquí hay un caso simple:
fuente
Solo use el
loopState
que se puede proporcionar.Consulte este artículo de MSDN para ver un ejemplo.
fuente