2013-04-28 4 views
7

私はloopState.Stop()loopState.Break()を理解するのが難しいです。私はそれについてMSDNといくつかの記事を読んだが、私はまだ混乱している。Parallelの中断を停止してください。

私が理解していることは、すべての反復分割プログラムがスレッドの残りのインデックスを処理し、loopState.Stop()がすべてのスレッドを停止し、loopState.Break()が現在のスレッドを停止することです。私は10と25の数字がある理由は、結果にはわかりません

0 25 1 2 3 4 5 6 7 8 9 10 

:私は結果を休閑している。このループの

Parallel.For(0, 100, (i, loopState) => 
{ 
    if (i >= 10) 
     loopState.Break(); 
    Debug.Write(i); 
}); 

ただし、次のような状況を考慮することができます。

誰でも手助けできますか?

P.S.私は5205M CPUを持っています(2コア=> 4スレッド)

答えて

9

loopState.Break()returnのような機能を壊しません。したがって、loopState.Break()の後の行はまだ実行されます。その番号のスコープが終了した後、forloopState.Break()が呼び出されたかどうかを確認します。その場合、すべてのループは、Breakと呼ばれる数に達するまで続行されます。

あなたの例では、0から24までのループは、ループ25から49まで同時に破られ(そしてそれらの "破損"番号を表示します)。

ループ50..74と75..99は始動しません。第2ループ25..49はすでに起動している番号が突破番号10より大きいため、操作全体を既に中止しているためです。

+0

したがって、loopState.Break()はすべてのスレッドを終了しますか?私はloopState.Stop()がそれをすることを使用します。 –

+0

私の前のコメントを明確にするために、最初の2つのループがどのように停止するのか理解していますが、なぜ2つの他のスレッドも起動しないのですか? Breakは1つ以上のスレッドを終了できますか?もしそうなら、それはどうやって? –

+0

停止対ブレイクについての良い答えを参照してください:http://stackoverflow.com/questions/8818203/what-is-difference-between-loopstate-break-loopstate-stop-and-cancellationt –

3

the documentation of Break()から:

ブレークは、現在の反復の後には、他の反復が実行される必要がないことをループに通信するために使用することができます。たとえば、Forループの100回目の繰り返しから0〜1000までの繰り返しでBreakが呼び出された場合でも、100未満の反復はすべて実行されますが、101〜1000の反復は必要ありません。これが何を意味するのか

現在の反復がまだ終了します(そう10が印刷されます)ということです。 Break()も時間移動ができないので、25が印刷されたままになります。 Break()が意味することは、新しいの反復が10を超えることを意味しません。

0

ブレークは、実行中のすべての反復が確実に終了するようにします。

停止はすべてを終了します。

1

if (i >= 10) loopState.Break();は、現在の反復を続けます。したがって10が印刷されます。

ただし、呼び出されたloopState.Break()の後の反復(i> = 10)は開始されません。

なぜ25が印刷されますか?次の画像はその理由を説明します。あなたは4つのスレッドを持っているので、0-99は4に分割されます。

最初のスレッドは0-24です。
第二のスレッドがあります:25 - 49
第三のスレッドがあります:50 - 74
第四のスレッドがあります:75 - 私の理解に基づいて99

、数字自体各スレッドがループを。 this postによれば、ブレイクが呼び出されたとき、彼らはすでに開始された場合

追加の反復が、実行することができると言います。

第2スレッドが第1スレッドとほぼ同じ時間に開始されたので、0, 25が印刷されます。 2番目のスレッドで25をループすると、if (i >= 10) loopState.Break();が呼び出されます。

Break()が呼び出される前に3番目と4番目のスレッドのループが開始されず、10より大きい数値が出力されませんでした。 - IsCompletedLowestBreakIteration

我々はloopState.Break()を使用し、最小反復を表す整数を返しLowestBreakIterationhttp://www.albahari.com/threading/part5.aspx

0

静的Parallelクラスの全てのメソッドParallelLoopResult .Thisオブジェクトは、2つの特性を有する返し: 画像refは

Breakステートメントが呼び出された

loopState.Stop()LowestBreakIteration戻り値null

関連する問題