-1

バリアを使用する単純な C# の例を作成しましたが、関数の 1 つに例外をスローしましたが、予期しない結果が得られました

phase 1 of DoWork1
phase 2 of DoWork2
phase 3 of DoWork3
Current phase 0
phase 2 of DoWork3
phase 2 of DoWork1
phase 3 of DoWork2
//so far everything is fine, lets throw an exception now

DoWork1 canceled
phase3 of DoWorn1

//end 

コードでわかるように、DoWork1メソッドで例外をスローし、3つのメソッドすべてが例外を処理することを期待していましたが、最初のメソッドのみが例外を処理することを期待していました.2番目の問題は、最初のメソッドのみが「フェーズ3 bla bla」を出力し、3つすべてを期待したコンソールに出力します。なぜこれが起こるのか誰か説明してもらえますか

コードは少し長いですが、そのほとんどは単なるコピペです

4

2 に答える 2

1

まず、あるスレッドでスローされた例外は、通常、他のスレッドでは使用できません。例外は呼び出しスタックを上に移動し、各スレッドには独自のスタックがあります。

次に、他の 2 つのメソッドがフェーズ 3 に到達しない理由は、DoWork1が例外をスローしたときに、このバリア内の他の参加者を待機しようとして失敗したためです。DoWork1その時点で、バリアは が他の参加者を待ってSignalAndWait()いるとはもはや信じていませDoWork1SignalAndWait

于 2011-07-25T17:01:24.543 に答える
0

各スレッドには独自のコール スタックがあります。そのため、例外をスローしているスレッドのみがキャッチされます。

于 2011-07-25T17:01:54.670 に答える