Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

268
Visualizações
Parallel.ForEach: Break y ParallelLoopState.LowestBreakIteration. ¿Qué hacer al respecto?

En este artículo en docs microsoft, en el ejemplo de Parallel.For en el método, hay una llamada Break y el procesamiento de propiedades como ShouldExitCurrentIteration y LowestBreakIteration de la siguiente manera:

 if (state.ShouldExitCurrentIteration) { if (state.LowestBreakIteration < i) return; }

LowestBreakIteration almacena el número de la iteración mínima en la que se llamó al método Break. Además, esta propiedad puede almacenar el valor del índice generado internamente, por ejemplo, en el caso del método Parallel.ForEach ( fuente en docs microsoft)

pregunta ¿Qué debo hacer con la propiedad LowestBreakIteration en el caso de Parallel.ForEach, cómo debo usarla y con qué debo compararla?

Repetí fácilmente el ejemplo con Break for Parallel.For, pero no sé cómo usar la propiedad LowestBreakIteration en el ejemplo con Break for Parallel.ForEach.

 using System; using System.Collections.Generic; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { static void Main(string[] args) { //Parallel.For void MyMethodForParallelForBreak(int i, ParallelLoopState MyParallelLoopState) { Console.WriteLine($"Start {i}"); if (MyParallelLoopState.ShouldExitCurrentIteration) { if (MyParallelLoopState.LowestBreakIteration < i) //Processing LowestBreakIteration here { Console.WriteLine($"Current {i}. Return: LowestBreakIteration {MyParallelLoopState.LowestBreakIteration} < {i}"); return; } } if (MyParallelLoopState.LowestBreakIteration != null) { Console.WriteLine($"Current {i}. LowestBreakIteration {MyParallelLoopState.LowestBreakIteration}"); } if (i > 5) { MyParallelLoopState.Break(); Console.WriteLine($"Current {i}. Break"); } Console.WriteLine($"End {i}"); } Parallel.For(1, 11, MyMethodForParallelForBreak); Console.WriteLine("\n"); //Parallel.ForEach void MyMethodForParallelForEachBreak(KeyValuePair<string, string> MyKeyValuePair, ParallelLoopState MyParallelLoopState) { Console.WriteLine($"Start {MyKeyValuePair.Key}"); if (MyParallelLoopState.ShouldExitCurrentIteration) { if (MyParallelLoopState.LowestBreakIteration < ) //Error. Unknown. Processing LowestBreakIteration here { Console.WriteLine($"Current {MyKeyValuePair.Key}. Return: LowestBreakIteration {MyParallelLoopState.LowestBreakIteration} < Unknown"); return; } } if (MyParallelLoopState.LowestBreakIteration != null) { Console.WriteLine($"Current {MyKeyValuePair.Key}. LowestBreakIteration {MyParallelLoopState.LowestBreakIteration}"); } if (MyKeyValuePair.Value == "a") { MyParallelLoopState.Break(); Console.WriteLine($"Current {MyKeyValuePair.Key}. Break"); } Console.WriteLine($"End {MyKeyValuePair.Key}"); } Dictionary<string, string> MyDictionaryForStringAndString = new Dictionary<string, string>(); MyDictionaryForStringAndString.Add("a1", "abc"); MyDictionaryForStringAndString.Add("a2", "ab"); MyDictionaryForStringAndString.Add("a3", "a"); MyDictionaryForStringAndString.Add("a4", "abc"); MyDictionaryForStringAndString.Add("a5", "ab"); MyDictionaryForStringAndString.Add("a6", "a"); MyDictionaryForStringAndString.Add("a7", "abc"); MyDictionaryForStringAndString.Add("a8", "ab"); MyDictionaryForStringAndString.Add("a9", "a"); MyDictionaryForStringAndString.Add("a10", "abc"); Parallel.ForEach(MyDictionaryForStringAndString, MyMethodForParallelForEachBreak); } } }
over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Puede verificar la propiedad ShouldExitCurrentIteration para ver si necesita salir del foreach paralelo:

 if (state.ShouldExitCurrentIteration) { // some other thread called state.Break() return; }
over 4 years ago · Santiago Trujillo Relatório

0

Si desea verificar LowestBreakIteration en un bucle Parallel.Foreach , hay una sobrecarga que toma un Action<TSource, ParallelLoopState, long> . Donde el valor largo representa el índice.

Me gustaría señalar que el uso de LowestBreakIteration / ShouldExitCurrentIteration me parece muy esotérico. El único caso de uso que puedo imaginar sería que cada iteración involucre múltiples operaciones costosas, por lo que desea salir lo más rápido posible y aún desea procesar todos los elementos antes de la iteración que llamó a la interrupción.

Estoy seguro de que nunca sentí la necesidad de tal funcionalidad, y aunque probablemente sea bueno tenerla para aquellos que la necesitan, no me preocuparía por eso.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda