是否有必要显式调用对COM对象的线程?

时间:2014-07-21 18:44:24

标签: vb.net multithreading activex rcw

我正在使用.NET的第三方Activex控件。我已成功创建了RCW(AxInterop.ACMELib.dll和Interop.ACMELib.dll),方法是添加对ActiveX ocx的引用并将控件拖到我的表单上。

此时,RCW提供的接口缺乏,我决定创建自己的Component作为附加包装器。一个原因是我从许多线程访问RCW,我希望一次只能将对RCW的访问同步到一个线程。我的班级看起来像:

Public Class ACMEWrapper ' my Component
    Inherits AxACMELib.ACMEClass 

    Public Overrides Function GetData() As Int()
        Dim result As Int()
        Try
            SyncLock LockACMEObject
                result = MyBase.GetData()
            End SyncLock
            Return result
        Catch
            ' log exception, etc.
        End Try
    End Function

这个类在大多数情况下都能正常工作。但是,有时我的应用程序崩溃时没有可以由我的应用程序处理的异常。甚至不是来自catch-all未处理的异常处理程序。在某些情况下,它确实会捕获“外部组件抛出异常...”,我无法从中恢复。

我以为我已经尝试了一切,直到我明确地在它创建的线程上调用RCW的所有调用,即

MyBase.Invoke(Sub() result = MyBase.GetData())

我的应用程序不再以这种方式崩溃。我在网上搜索了我的行为的理由,因为什么时候有用,我想知道为什么它有效。一无所获,我决定发布这个问题。有人可以告诉我为什么我的工作是有效的,并引导我阅读一些有关这个主题的更多信息的文献吗?

0 个答案:

没有答案