【发布时间】:2017-04-12 10:02:11
【问题描述】:
我需要安全地处理异步事件而没有“隐式并行”的风险,因此在异步事件上使用他的 Nito.AsyncEx / Nito.AsyncEx.Oop 库和 great tutorial 实现了“延迟”机制advised by @StephenCleary。
效果很好。所以我的事件订阅者看起来像这样:
dbContext.SavingChanges += async (sender, e) => {
using (e.GetDeferral()) {
Audit();
await Validate(); // this could throw
}
};
但是,假设Validate() 抛出异常。我需要它“冒泡”给活动的制作人。换句话说,由于这是一个“命令事件”,它在完成后更新事件生产者,我希望异常也能到达那里。但当然不是。
有没有办法做到这一点?
(背景:就在 db 上下文保存之前,它会引发事件以供处理程序执行额外工作,例如审核、验证。如果验证失败,我希望上下文捕获异常以便中止保存。)
【问题讨论】:
-
.NET 中的事件设计在这里并不能很好地工作 - 事件意味着可以由多个处理程序订阅。这些处理程序需要进行自己的错误处理,因为如果某些处理程序成功处理然后其中一个抛出,这意味着什么?
-
我同意,但是对于“命令式”事件,必须考虑例外情况。由于有信号返回源,因此也必须有某种方法可以发送回有效负载(有效负载是一个异常,可以重新抛出)。
-
@Damien_The_Unbeliever 是的,你说得对,正是这一点让我重新思考了设计……如果你有多个返回值或异常,你会重新抛出/处理哪一个?有点随意,所以这是一个糟糕的设计。
标签: c# events asynchronous async-await