Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 是否需要显式调用COM对象的线程?_Vb.net_Multithreading_Activex_Rcw - Fatal编程技术网

Vb.net 是否需要显式调用COM对象的线程?

Vb.net 是否需要显式调用COM对象的线程?,vb.net,multithreading,activex,rcw,Vb.net,Multithreading,Activex,Rcw,我正在使用.NET中的第三方Activex控件。通过添加对ActiveX ocx的引用并将控件拖到表单上,我已成功创建了RCWs Axintero.ACMELib.dll和Interop.ACMELib.dll 此时,RCW提供的接口缺失,我决定创建自己的组件作为额外的包装器。一个原因是我从多个线程访问RCW,我希望一次只同步一个线程对RCW的访问。我的班级看起来像: Public Class ACMEWrapper ' my Component Inherits AxACMELib.A

我正在使用.NET中的第三方Activex控件。通过添加对ActiveX ocx的引用并将控件拖到表单上,我已成功创建了RCWs Axintero.ACMELib.dll和Interop.ACMELib.dll

此时,RCW提供的接口缺失,我决定创建自己的组件作为额外的包装器。一个原因是我从多个线程访问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
这门课在大多数情况下都很好。但是,有时我的应用程序会崩溃,而我的应用程序可以处理任何异常。甚至不是来自一个“捕获所有未处理的异常”处理程序。在某些情况下,它确实捕获了外部组件抛出的异常。。。我无法从中恢复

我以为我已经尝试了所有的方法,直到我突发奇想,在创建RCW的线程上显式调用了所有对RCW的调用

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

我的应用程序不再以这种方式崩溃。我在网上搜索了我的行为的正当性,就像我想知道它为什么起作用一样。没有发现任何东西,我决定发布这个问题。有人能告诉我为什么我所做的是有效的,并指导我阅读一些关于这个主题的更多信息的文献吗?

Hmm,这是不寻常的,ActiveX控件从来都不是线程安全的。您需要记录组件的ThreadingModel注册表项。当它同时出错或是免费时会出现问题,你的同步锁并不能帮助解决这个问题。您的调用确实如此。然后调用已经自动封送,而无需调用Invoke。也不需要锁定。你最好仔细检查一下你的包装器方法,确保它们不会造成线程问题。我只锁定了对基本组件的每个调用,因为我认为当我遇到内存泄漏和随机崩溃时,它不能正确处理并发调用。第三方承认在使用C++时会出现内存泄漏,但他们不知道如何修复。锁定确实解决了一个问题,我从外部组件得到的崩溃大大减少,并且没有更多的内存泄漏。回想起我还以为这些电话也应该像你说的那样自动处理。我仍然不确定为什么MyBase.Invoke已经停止了崩溃。仅仅改变时间就足以隐藏线程争用错误,Invoke当然可以做到这一点。显然,你确实需要担心这一点。