質問

私は障壁を使用する簡単な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再び。

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top