1

私は、いくつかの作業を行うためにいくつかのスレッドを生成するクラスを持っています。イベントが発生した場合に作業を停止する機能が必要です。イベント ハンドラーは、生成されたクラス say(Interrupted) にフィールドを設定します。For-Each のデリゲートでは、次の反復に進む前にこのフラグをチェックしています。

public bool Interrupted { get; set; }

Parallel.ForEach(some collection){
if (Interrupted)
                        {
                            parallelLoopState.Break();
                            return;
                        }
    else 
    DoSomething();

}

親スレッドで Interrupted が true に設定されるようになりました。Parallel.Foreach によって生成されたスレッドにすぐに表示されますか? それとも、可視性が得られるまでに時間がかかりますか?

私のテストは断続的に失敗し、親スレッドがフラグを設定した後でも、子スレッドが数回実行されたことを示唆していますか? 基本的なものが欠けていますか?

これは Volatile のユース ケース シナリオですか?

4

2 に答える 2

1

Parallel.ForEach メソッドに渡されたコード ブロックで並列実行が行われます。そのため、メイン スレッドが true に設定すると、一部のスレッドは if (Interrupted) テストを通過したばかりになります。foreach ループの後続の実行のみがそれをキャッチします。

于 2013-07-23T17:34:23.363 に答える