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
116
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