Damien_The_Unbeliver , , - . , , break for foreach, , ParallelLoopState . ParallelLoopState , , , Stop() Break().
Stop() , , Stop() , , , , .
Break() , Stop(), IEnumerable, , Break() on. , , , .
ParallelLoopResult, foreach, , foreach , Break(), .
Parallel.ForEach(list, (item, loopState) =>
{
bool endEarly = doStuff(item);
if(endEarly)
{
loopState.Break();
}
}
);
foreach(var item in list)
{
bool endEarly = doStuff(item);
if(endEarly)
{
break;
}
}
static bool[] list = new int[]{false, false, true, false, true, false};
long LowestElementTrue()
{
ParallelLoopResult result = Parallel.ForEach(list, (element, loopState) =>
{
if(element)
loopState.Break();
}
if(result.LowestBreakIteration.IsNull)
return -1;
else
return result.LowestBreakIteration.Value;
}
, , 2 .
, , 0-2, 3-5.
Thread 1: Thread 2
0, False, continue next 3, False, continue next
1, False, continue next 4, True, Break
2, True, Break 5, Don't process Broke
Break 2, ParallelLoopResult.LowestBreakIteration 2 , , , 2.
, Stop.
static bool[] list = new int[]{false, false, true, false, true, false};
long FirstElementFoundTrue()
{
long currentIndex = -1;
ParallelLoopResult result = Parallel.ForEach(list, (element, loopState, index) =>
{
if(element)
{
loopState.Stop();
Interlocked.Exchange (ref currentIndex , index);
}
}
return currentIndex;
}
, , 2 4 .
, , 0-2, 3-5.
Thread 1: Thread 2
0, False, continue next 3, False, continue next
1, False, continue next 4, True, Stop
2, Don't process, Stopped 5, Don't process, Stopped
4 . , 0-2 3-5.
Thread 1: Thread 2
0, False, continue next 1, False, continue next
2, True, Stop 3, False, continue next
4, Don't process, Stopped 5, Don't process, Stopped
2 4.