c# - 安全地抛出在另一个线程上创建的异常 C#

标签 c# multithreading exception thread-safety

我想在线程A中捕获异常,然后将异常对象传递给线程B,并从线程B中抛出它。这样安全吗?

线程A

try {
    // Code that throws exceptions
} catch (Exception e) {
    sendToOtherThread(e);
}

线程B

Exception e = receiveException();
throw e;

编辑

为了清楚起见:我了解线程的工作原理,以及如何将对象引用从一个线程传递到另一个线程。问题更多的是从一个未创建异常对象的线程中抛出异常对象是否安全,或者类 Exception 本身或 .NET 处理它的方式是否存在任何问题。

最佳答案

可以重新抛出从另一个线程接收到的异常(例如,在BackgroundWorker的RunWorkerCompleted事件处理程序中),但更常见的做法是将其包装在另一个异常中,以保留堆栈跟踪:

private void backgroundWorker1_RunWorkerCompleted(
    object sender, RunWorkerCompletedEventArgs e)
{
    // First, handle the case where an exception was thrown.
    if (e.Error != null)
    {
        throw new SomeException("... message ...", e.Error);
    }
    ...
}

关于c# - 安全地抛出在另一个线程上创建的异常 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11326544/

相关文章:

c# - 是否可以将内插字符串作为参数传递给方法?

c# - 如何在 AvalonEdit 中启用虚拟空间?

C# 根据字符串同步线程

c# - 使用虚拟属性支持 NHibernate 代理; ReSharper 警告构造函数中的虚拟成员调用

java - 创建线程后如何将信息传递给线程

java - 在 Java 中如何以及在哪里定义自己的异常层次结构?

java - 在同一数据库上运行的不同线程中的多个游标

c++ - Linux C++ 线程已死,但 "hanging"- 线程限制

c# - 有时使用单个 try catch 而不是大量的 TryParsing 和其他错误处理不是更好吗?

python - 检查数字 Python 代码中的参数