-1

我创建了使用障碍的简单 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 

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

代码有点长,但大部分只是复制粘贴

4

2 回答 2

1

首先,在一个线程上引发的异常通常不会在任何其他线程上可用。异常沿调用堆栈向上传播,每个线程都有自己的堆栈。

其次,其他两种方法都没有到达阶段 3 的原因是,在DoWork1抛出异常时,是因为它试图等待这个屏障中的其他参与者而失败。到那时,屏障不再认为DoWork1是在等待其他参与者,所以当其他两个参与者,SignalAndWait()他们永远等待,因为DoWork1再也不会SignalAndWaits了。

于 2011-07-25T17:01:24.543 回答
0

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

于 2011-07-25T17:01:54.670 回答