Quebrar paralelo.foreach?

como é que saio de um paralelo?para o laço?

tenho uma afirmação bastante complexa que se parece com a 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 este processo de longe. No entanto, não consigo descobrir como quebrar o laço paralelo? A declaração break; lança o seguinte erro de sintaxe:

sem fechos dos quais quebrar ou continuar

Author: Rasmus Søborg, 2012-09-24

5 answers

ParallelLoopState.Break Método:

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

Ou no seu 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();
        }
    }));
 190
Author: Tudor, 2012-09-24 18:56:38
Você faz isso usando a sobrecarga de {[[0]} ou {[1] } que passa em um estado de loop, em seguida, chamando ParallelLoopState.Break ou ParallelLoopState.Stop. A principal diferença é a rapidez com que as coisas rompem - com Break(), o loop irá processar todos os itens com um "índice" mais antigo do que o actual. Com Stop(), ele vai sair o mais rápido possível.

Para mais detalhes, veja Como parar ou quebrar de um paralelo.Para O Loop.

 49
Author: Reed Copsey, 2012-09-24 18:56:24

O que deves usar é Any, em vez de um laço foreach:

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

Any é inteligente o suficiente para parar assim que souber que o resultado deve ser verdadeiro.

 12
Author: Servy, 2012-09-24 18:58:04
LoopState é certamente uma grande resposta. Descobri que as respostas anteriores tinham tantas outras coisas que era difícil ver a resposta, então aqui está um caso simples:
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.
});
 10
Author: MBentley, 2015-07-31 18:13:49

Usa apenas o loopState que pode ser fornecido.

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

Veja este artigo MSDN por exemplo.

 5
Author: Mike Perrenoud, 2012-09-24 18:57:49