.NET事件,线程和COM上下文如何协同工作?

时间:2010-11-17 17:52:38

标签: .net multithreading events com interop

我有一个用C ++开发的COM对象。此类使用另一个(第三方)COM对象,它抛出一个事件EvtThirdParty。这个第三方对象只是我班级的一种方法。

现在我正在使用.NET中的COM对象(Visual Basic用于它的价值)应用程序,我想从Visual Basic应用程序中捕获EvtThirdParty。

我猜这里没有简单的方法可以做到这一点,但是请在这里提供这些信息以防万一有人指出一个。所以,我在我的COM对象中添加了一个事件(EvtThirdPartyDummy),每当它捕获EvtThirdParty时,都会将一个EvtThirdPartyDummy引发到VB.NET。

到目前为止,非常好。

现在,当应用程序收到此事件时,它必须对我的对象进行几次调用,以获取一些信息。

这是我的问题开始的地方。我得到一个关于断开连接的上下文的奇怪消息:

  

检测到已断开连接的上下文

     

消息:上下文0x1b9351e0'是   断开。释放接口   从当前的背景(背景   0x1b934f90)。这可能会导致腐败   或数据丢失。为了避免这个问题,   请确保所有   上下文/公寓保持活力直到   应用程序完全完成   使用RuntimeCallableWrappers   表示生活的COM组件   他们内心。

我不是绝对肯定这是我得到的确切消息,因为我的Visual Studio 2005是西班牙语,我在Google中发现了这一点,但它似乎足够接近。存在一些差异(例如,我的消息的标题是“Visual Studio 2005”,IIRC,但这可能是由于不同的IDE版本)。

对于我在Google中发现的内容,似乎创建对象的线程已被破坏,但我很确定情况并非如此。它是在主应用程序线程中创建的。

如果我从事件处理程序中删除所有代码,那么一切都可以作为魅力。

我最好的猜测是我的活动是在一个全新的线程中处理的,但AFAIK不应该这样。

发生了什么事?

2 个答案:

答案 0 :(得分:3)

这是来自托管调试助手的警告,文档are here。虽然它是一个警告,但如果它在事件回调期间发生,则不应该忽略它。它通常是一个线程问题,拥有COM对象的线程已经退出。或称为CoUnitialize()拆除其公寓。同样的事情,一个退出的线程调用CoUnitialize()。

你的问题几乎没有真正有助于为它提供一个像样的诊断。请考虑这个第三方COM组件可能与它有关的可能性,例如在另一个线程上引发事件。 Debug + Windows + Threads窗口应该有帮助。并注意Output窗口,它显示了线程终止通知。

答案 1 :(得分:2)

首先,这不是我的强项,但因为你还没有任何回应......

事件是在不同的线程上引发的,所以你所说的关于在另一个线程上的说法听起来很合理。您可以尝试在事件处理程序中调用Invoke()以使主线程返回并在事件引发后检查您的对象。

它是什么类型的项目以及 主线程在做什么?

如果这可能是性能方面的问题(锁定UI / ???),那么让一个不同的线程包围该对象并等待被告知事件可能更有意义。然后在事件处理程序中,通知创建者线程它有工作要做。

正如我所说,我远非专家,所以也许其他人可以给你更好的答案。