¿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.Breakmé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.ForoParallel.ForEachque pasa en un estado de bucle, luego llame aParallelLoopState.BreakoParallelLoopState.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:Anyes 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
loopStateque se puede proporcionar.Consulte este artículo de MSDN para ver un ejemplo.
fuente