c#障碍和异常处理

本文关键字:异常处理 | 更新日期: 2023-09-27 18:03:20

我创建了一个简单的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个方法都能打印到控制台。有没有人能告诉我为什么会这样?

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

c#障碍和异常处理

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

第二,其他两个方法从未到达阶段3的原因是,当DoWork1抛出异常时,这是因为它试图等待这个障碍中的其他参与者,但失败了。此时,屏障不再认为DoWork1在等待其他参与者,所以当其他两个SignalAndWait()时,它们永远等待,因为DoWork1再也不会出现SignalAndWait了。

每个线程都有自己的调用栈。因此,只有抛出异常的线程才会被捕获。