【问题标题】:3rd party dll raising events第 3 方 dll 提升事件
【发布时间】:2010-11-05 01:45:11
【问题描述】:

我使用第三方 dll 从他们的服务器获取一些数据。我调用了一个 void 方法,然后我订阅了调用此方法引发的事件。引发的事件通过其参数返回数据。

所以, 调用: void getdata(id) raises: void onReturn(object) --> 返回一个包含数据的对象。

这在每次调用 getdata(id) 时都有效

问题是,当我遍历 id 列表,并在该循环中为该列表调用 getdata(id) 时,没有正确引发相应的事件。 假设有 10 个 id 的列表,有 10 次调用 getdata(id) 但只引发了很少的 onReturns。

返回的对象还返回传递给 getdata(id) 的 id,以便我可以匹配我发送的数据和我接收的数据。

有没有办法确保所有事件都被监听?因此,如果我通过 getdata(id) 发送 10 个 id,我想确保处理 10 个 onReturn。

我正在使用 c#,.net 4.0

谢谢

【问题讨论】:

  • 您是在注册返回事件还是有一个委托作为回调传递?
  • 注册返回事件。

标签: c#


【解决方案1】:

如果是第三方 DLL,则不知道他们是如何实现的。当您在调试模式下单步执行时,您是否在调用 onReturn() 侦听器之前通过了对 getData() 的调用?如果是这样,它可能在内部使用线程(或至少是异步侦听器),并且调用多个getData()s 过于靠近可能会导致它踩到待处理的响应。

我想尝试解决这个问题的唯一方法是自己使用多线程,例如在调用getData() 后等待并在onReturn() 事件中释放的互斥锁。这样一来,您一次只有一个未完成的请求,这似乎是适合您的条件。

编辑:你和第三方供应商谈过这件事了吗?如果您首先想到我们,我猜他们的支持并不是最好的,但可能值得一试。

编辑第二个:当你说它从他们的服务器获取数据时,这是否意味着它通过网络发出请求?如果这些请求没有加密,也许您可​​以对协议进行逆向工程并为自己创建一个新的 API,而不是依赖一个经过验证的有缺陷的黑匣子。

【讨论】:

  • +1,同意这是在工作线程上引发的事件的可能性。让 getdata() 不只是返回数据没有多大意义。是的,从供应商那里获得支持。
  • 它是一个旧的 dll,他们不再支持它了。但我们仍然使用它。我会试试你的解决方案。感谢您的反馈,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多