c#屏障和异常处理

时间:2011-07-25 16:48:22

标签: c# exception barrier

我创建了一个简单的c#示例,它使用了障碍,我在一个函数中抛出了一个异常,我得到了意想不到的结果

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 

现在正如您在Code中看到的那样,我在DoWork1方法中抛出了一个异常,我希望所有3个方法都能处理异常,但只有第一个方法可以处理,第二个问题是只有第一个方法打印“阶段3 bla bla“我希望所有3个人都把它打印到控制台。有人可以解释一下为什么会发生这种情况

Code有点长,但大多数只是复制粘贴

2 个答案:

答案 0 :(得分:1)

首先,在一个线程上抛出的异常通常不会在任何其他线程上可用。异常在调用堆栈中向上移动,每个线程都有自己的堆栈。

其次,其他两种方法永远不会达到阶段3的原因是当DoWork1抛出异常时,这是因为它试图等待此障碍中的其他参与者并失败。此时,障碍不再认为DoWork1正在等待其他参与者,所以当其他两个SignalAndWait()时,他们会永远等待,因为DoWork1永远不会SignalAndWait s试。

答案 1 :(得分:0)

每个线程都有自己的调用堆栈。所以只有你抛出异常的线程才会被捕获。