gpt4 book ai didi

c# - 是否可以在不同线程上多次抛出一个 C# 异常?

转载 作者:行者123 更新时间:2023-11-30 22:01:27 24 4
gpt4 key购买 nike

我有一个实现供应商/消费者模式的 C# 服务器。该服务器有一个生成一些数据的供应商线程。多个消费者线程消费数据。对数据的访问已正确锁定,因此一切正常。但是有时供应商线程无法获取数据。在这种情况下,它会抛出异常。异常在同一个线程中被捕获。但是在发生异常之后,有必要在每个消费者线程上抛出同样的异常。所以我有一个问题:在多个线程上多次抛出一个异常对象是否安全?我知道 CLR Exception 和所有继承 Exception 的类都必须具有 [Serializable] 属性。这可能表明 Exception 对象在抛出时被序列化,但我找不到这方面的任何信息。

最佳答案

is it safe to throw one exception object several times on multiple threads?

是的,它是安全的,假设您的异常对象是线程安全的。只要确保在多个线程上重新抛出的 Exception 对象本身是线程安全的,那么在多个地方重用同一个对象就不会出现问题*.

但是,每个消费者线程抛出自己的异常以响应原始异常,并将原始异常用作构造函数中的 innerException 参数可能是一个更好的主意。内部异常将在所有线程之间保持共享,但嵌套结构将从捕获异常的用户的角度更好地反射(reflect)发生的情况。

如果您重新抛出原始异常,捕获它的用户将只能找到原始抛出者,即生产者 线程。这可能会造成混淆,因为它们从消费者线程接收到异常,因此它们很难将导致异常的事件链拼凑在一起,因为堆栈跟踪将关闭。

另一方面,嵌套异常来自消费者线程,但它们也提供 innerException 作为其根本原因,因此捕获者可以更好地了解到底发生了什么。

I know that CLR Exception and all classes that inherit Exception must have [Serializable] attribute. This maybe an indication that Exception object is serialized on throwing, but I couldn't find any info on this.

添加 [Serializable] 属性的原因在 this Q&A 中有描述.它对同一应用域内多个线程的异常可用性没有影响。

*假设重新抛出发生在不同线程上相同方法的相同位置。

关于c# - 是否可以在不同线程上多次抛出一个 C# 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27695833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com