所以 - 我有这个我正在使用的外部组件。它会触发事件DataReceived
。然后我做了一些数据库操作,这些操作可能由于数据问题或代码中的一些错误而失败。如果我能够起泡,那就太好了。 GUI中的例外。在我的情况下,由于程序集的工作方式,我需要阻止调用GUI。我不确定这是不是一个好主意,但现在根据外部代码的工作原理,这是唯一想到的事情。
程序集假定如果回调(事件)安全返回,则数据处理成功 - 可能不是这种情况。当然,我必须以某种方式处理错误,但这意味着另一方的服务器总是假设数据处理正确。
我的问题是:
答案 0 :(得分:0)
我不认为这是被设计破坏。如果您收到该活动,您将收到消息来源中发生变化的通知。现在,您应该只执行从源获取所需信息所需的操作,并执行与源分离的任何进一步处理。为此,我将在事件处理程序中简单地获取数据(可能来自源;可能来自事件args)并将它们放入ConcurrentQueue
。在我的类中,另一个任务正在运行,使用BlockingCollection
检索此队列中的元素来处理它们。如果有任何失败,只需将Invoke()
调用到gui线程并告知用户发生了什么。
啊,而不是使用ConcurrentQueue
的另一种方法是使用Rx。有了它,您可以subscribe to an event使用ObserveOn()
在不同的线程上观察它,这将导致几乎相同(在这种情况下)但使用更多LINQish语法。