【问题标题】:c# barrier and exception handelingc# 屏障和异常处理
【发布时间】:2011-10-12 18:31:16
【问题描述】:

我创建了使用障碍的简单 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 “我希望他们三个都将它打印到控制台。谁能解释一下为什么会这样

Code有点长,但大部分都是复制粘贴

【问题讨论】:

  • 为什么您希望 t1 中的异常出现在 t2 和 t3 中?

标签: c# exception barrier


【解决方案1】:

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

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

【讨论】:

  • 非常感谢,现在我明白了 :))
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-06-02
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2012-05-04
    • 2012-06-11
    • 2011-04-27
    • 2011-09-11
    相关资源
    最近更新 更多