如何处理事件中的异常
本文关键字:异常 处理事件 | 更新日期: 2023-09-27 17:51:25
所以-我有这个外部程序集,我正在使用。它触发一个事件DataReceived
。然后我正在做一些数据库操作,可能会由于数据问题或代码中的一些错误而失败。如果我能将异常"弹出"到GUI中,那就太好了。在我的情况下,由于程序集的工作方式,我需要对GUI进行阻塞调用。我不确定这是不是一个好主意,但现在这是唯一想到的基于外部代码如何工作的事情。
程序集假定,如果回调(事件)安全返回,则数据已被成功处理——情况可能并非如此。当然,我必须以某种方式处理中的错误,但这意味着另一端的服务器将始终假设数据被正确处理。
我的问题是:
- 我可以将异常抛出到 GUI吗?如果有,怎么做?
- 我如何处理事件中的异常,使程序集不认为我处理了数据?我是否需要某种阻塞调用/异常进入 GUI?(这可能吗?) 旁注:难道汇编不是被设计破坏了吗?为什么仅仅根据回调是否返回就自动假定一切正常呢?
我不认为这是设计打破。如果您接收到该事件,您将获知源中发生了某些更改。现在,您应该只执行从源获取所需信息所需的操作,并执行与源分离的任何进一步处理。为此,我将在事件处理程序中简单地抓取数据(可能来自源;可能来自事件参数)并将它们放入ConcurrentQueue
中。在我的类中,另一个任务正在运行,使用BlockingCollection
从这个队列中检索元素来处理它们。如果有任何失败,只需将Invoke()
调用到gui线程并通知用户发生了什么。
啊,另一种代替使用ConcurrentQueue
的方法是使用Rx。这样,您就可以订阅一个事件,并通过使用ObserveOn()
在不同的线程上观察它,这将导致几乎相同的(在本例中),但使用更LINQish语法。