Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

263
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!