17

loopState.Stop()私は理解するのが難しいloopState.Break()です. MSDN とそれに関するいくつかの投稿を読みましたが、まだ混乱しています。

私が理解しているのは、すべての反復パーティショナーが、スレッドが処理する残りのインデックスを提供し、loopState.Stop()すべてのスレッドをloopState.Break()停止して現在のスレッドを停止するということです。

ただし、次の状況を考えてみましょう。

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

このループでは、次の結果が得られます。

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

結果に10と25の数字がある理由がわかりません。

誰でも助けることができますか?

PS 私は i5 520M CPU を持っています (2 コア => 4 スレッド)

4

7 に答える 7

12

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

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

ループ 50..74 と 75..99 は開始されません。これは、2 番目のループ 25..49 が for-operation 全体を既に中止しているためです。これらの開始番号はブレーク番号 10 より大きいためです。

于 2013-04-28T10:18:49.583 に答える
5

のドキュメントBreak()から:

ブレークは、現在の反復の後に他の反復を実行する必要がないことをループに伝えるために使用できます。たとえば、0 から 1000 まで並列に反復する for ループの 100 番目の反復から Break が呼び出された場合、100 未満の反復はすべて実行する必要がありますが、101 から 1000 までの反復は必要ありません。

これが意味することは、現在の繰り返しがまだ終了するということです (10出力されます)。Break()また、タイムトラベルができないため、25印刷されたままになります。Break()つまり、それ以降の新しい反復10開始されません。

于 2013-04-28T11:11:31.823 に答える
1

Breakは、現在実行中のすべての反復が確実に終了するようにします。

Stopはすべてを終了します。

于 2017-01-21T11:51:45.657 に答える