ParallelLoopState - используя Break, не выходя из текущей итерации, почему? - PullRequest
0 голосов
/ 01 октября 2018

Я сталкивался с этим примером, когда узнал о ParallelLoopState:

Parallel.For(0, 10, (int i, ParallelLoopState loopState) =>
            {
                if (i == 5)
                {
                    Console.WriteLine("Breaking loop");
                    loopState.Break();
                    Console.WriteLine("LowestBreakIteration = " +
 loopState.LowestBreakIteration);
                    }
                    Thread.Sleep(1000);
                    Console.WriteLine("i= " + i);

                });

Возможный результат этого:

i= 6
i= 4
i= 0
Breaking loop
LowestBreakIteration = 5
i= 2
i= 8
i= 1
i= 3
i= 7
i= 5

Очевидно, что каждый раз, когда приложение запускается, разныерезультат сформирован.Как может быть так, что «LowestBreakIteration = 5» и «i = 5» разделены другими значениями i?Я думал, что после выполнения if (i==5) он переходит непосредственно к следующей итерации, не записывая в консоли i = 5 (последняя строка кода: Console.WriteLine("i= " + i);).Согласно книге: «Перерыв гарантирует, что все выполняющиеся в настоящее время итерации будут завершены»

1 Ответ

0 голосов
/ 01 октября 2018

Это потому, что все другие итерации уже запущены.Если вы хотите остановить все операции, вам нужно использовать loopState.Stop() вместо loopState.Break()

loopState.Break() означает завершить все итерации во всех потоках, предшествующих текущей итерации в текущем потоке, и затем выйтицикл.

loopState.Stop() означает остановку всех итераций как можно скорее.

...