Rompi parallel.foreach?

Come posso uscire da un ciclo parallel.for ?

Ho una dichiarazione piuttosto complessa che assomiglia al seguente:

Parallel.ForEach(ColorIndex.AsEnumerable(), new Action((ColorIndexHolder Element) => { if (Element.StartIndex = I) { Found = true; break; } })); 

Usando la class parallela, posso ottimizzare questo processo di gran lunga. Però; Non riesco a capire come rompere il ciclo parallelo? La break; la dichiarazione genera il seguente errore di syntax:

Nessun anello di chiusura da cui interrompere o continuare

    Usa il metodo ParallelLoopState.Break :

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

    O nel tuo caso:

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

    Puoi farlo chiamando il sovraccarico di Parallel.For o Parallel.ForEach che passa in uno stato di loop, quindi chiamando ParallelLoopState.Break o ParallelLoopState.Stop . La differenza principale sta nel modo in cui le cose si interrompono rapidamente: con Break() , il ciclo elabora tutti gli elementi con un “indice” precedente rispetto a quello corrente. Con Stop() , uscirà il più rapidamente ansible.

    Per i dettagli, vedere Come: Interrompere o interrompere da un ciclo Parallelo.Per .

    Quello che dovresti usare è Any , piuttosto che un ciclo foreach:

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

    Any è abbastanza intelligente da fermarsi non appena sa che il risultato deve essere vero.

    LoopState è sicuramente un’ottima risposta. Ho trovato che le risposte precedenti avevano così tante altre cose che era difficile vedere la risposta, quindi ecco un semplice caso:

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

    Basta usare il loopState che può essere fornito.

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

    Guarda questo articolo MSDN per un esempio.