Pregunta Break parallel.foreach?


¿Cómo salgo de un parallel.for ¿lazo?

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;
        }
    }));

Utilizando la clase paralela, puedo optimizar este proceso por mucho. Sin embargo; No puedo entender cómo romper el bucle paralelo? los break; instrucción arroja el siguiente error de sintaxis:

Sin bucles envolventes para romper o continuar


75
2017-09-24 18:51


origen


Respuestas:


Utilizar el ParallelLoopState.Break método:

 Parallel.ForEach(list,
    (i, state) =>
    {
       state.Break();
    });

O en tu caso:

Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
    new Action<ColorIndexHolder, ParallelLoopState>((ColorIndexHolder Element, ParallelLoopState state) =>
    {
        if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
        {
            Found = true;
            state.Break();
        }
    }));

125
2017-09-24 18:56



Usted hace esto llamando llamando usando la sobrecarga de Parallel.For o Parallel.ForEach que pasa en un estado de bucle, luego llama ParallelLoopState.Break o ParallelLoopState.Stop. La principal diferencia está en cuán rápido las cosas se rompen - con Break(), el ciclo procesará todos los elementos con un "índice" anterior al actual. Con Stop(), saldrá lo más rápido posible.

Para más detalles, ver Cómo: Parar o Salir de un Paralelo. Para Loop.


31
2017-09-24 18:56



Lo que deberías estar usando es Any, en lugar de un bucle foreach:

bool Found = ColorIndex.AsEnumerable().AsParallel()
    .Any(Element => Element.StartIndex <= I 
      && Element.StartIndex + Element.Length >= I);

Any es lo suficientemente inteligente como para detenerse tan pronto como sepa que el resultado debe ser cierto.


11
2017-09-24 18:58



LoopState es sin duda una gran respuesta. Descubrí que las respuestas anteriores tenían tantas otras cosas que era difícil ver la respuesta, así que aquí hay un caso simple:

using System.Threading.Tasks;

Parallel.ForEach(SomeTable.Rows(), (row, loopState) =>
{
    if (row.Value == testValue)
    {
        loopState.Stop();  // Stop the ForEach!
    }       
    // else do some other stuff here.
});

7
2017-07-31 18:13



Solo usa el loopState eso se puede proporcionar.

Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),  
    new Action<ColorIndexHolder>((Element, loopState) => { 
        if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I) { 
            loopState.Stop();
        }     
})); 

Mira este Artículo de MSDN para un ejemplo.


5
2017-09-24 18:57