質問
私は障壁を使用する簡単な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つの方法すべてが例外を処理することを期待していましたが、最初の1つのみが行うと、2番目の問題は、最初のメソッドのみが「フェーズ3 bla bla」を印刷し、それらの3つすべてがコンソールに印刷することを期待していました。なぜこれが起こるのか誰かが私に説明できますか
コード 少し長いですが、そのほとんどは単なるコピーペーストです
解決
まず、1つのスレッドにスローされる例外は、通常、他のスレッドでは使用できません。例外はコールスタックを移動し、各スレッドに独自のスタックがあります。
第二に、他の2つの方法がフェーズ3に決して到達しない理由は DoWork1
例外をスローします。それは、この障壁の他の参加者を待って失敗したからです。その時点で、障壁はもはやそれを信じていません DoWork1
他の参加者を待っているので、他の2人が SignalAndWait()
, 、彼らは永遠に待ちます DoWork1
一度もない SignalAndWait
再び。
他のヒント
各スレッドには独自のコールスタックがあります。したがって、例外をスローしているスレッドのみがキャッチされます。
所属していません StackOverflow