我创建了一个简单的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有点长,但大多数只是复制粘贴
答案 0 :(得分:1)
首先,在一个线程上抛出的异常通常不会在任何其他线程上可用。异常在调用堆栈中向上移动,每个线程都有自己的堆栈。
其次,其他两种方法永远不会达到阶段3的原因是当DoWork1
抛出异常时,这是因为它试图等待此障碍中的其他参与者并失败。此时,障碍不再认为DoWork1
正在等待其他参与者,所以当其他两个SignalAndWait()
时,他们会永远等待,因为DoWork1
永远不会SignalAndWait
s试。
答案 1 :(得分:0)
每个线程都有自己的调用堆栈。所以只有你抛出异常的线程才会被捕获。