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); } } }Puede verificar la propiedad ShouldExitCurrentIteration para ver si necesita salir del foreach paralelo:
if (state.ShouldExitCurrentIteration) { // some other thread called state.Break() return; }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.