在专用线程中运行COM对象 - RCW错误

时间:2016-10-12 00:16:58

标签: vb.net multithreading com activex rcw

使用Windows Forms和VB.NET,我正在尝试创建一个与ActiveX / COM对象接口的应用程序GUI。

我可以直接从表单创建和使用COM对象,也可以通过单独模块上的类创建和使用COM对象。但是,这两种情况都会导致UI在调用对象方法时挂起。

所以,我一直在尝试创建一个单独的线程来专门处理COM对象。我已经按照我喜欢的方式工作了,但它看起来并不那么强大。我是线程新手,想要一些替代方法(如果有的话)。

我正在创建线程并循环以使其保持打开状态。如果我在创建对象后允许线程终止,则任何后续方法调用都会产生

  

无法使用已与其基础RCW分离的COM对象。

错误。

这是我的类的构造函数,它将处理COM对象:

Sub New()

    myThread = New Thread(AddressOf ThreadLoop)
    myThread.SetApartmentState(ApartmentState.STA)
    myThread.Start()

End Sub

这是在线程中运行的主循环:

Private Sub ThreadLoop()

    ComObject = New ComObject
    ComObject.CreateControl()

    While Not _Terminate
        Application.DoEvents()

        Select Case _State

            Case 1
                _Open()
            Case 2
                _Close()
            Case 3 '...

            Case Else
                Thread.Sleep(0)

        End Select

    End While

    'ComObject.Dispose()
    myThread.Abort()

End Sub

_Terminate是一个终止循环的布尔属性。

_State是从UI修改的int,并且(基于case语句)触发处理COM调用的方法 - 即

Private Sub _Open()

    Try
        iReturnCode = ComObject.Open()
    Catch ex As Exception
        iReturnCode = -1
    End Try

    _State = 0
    RaiseEvent UpdateUI("Open", Nothing)

End Sub

令人惊讶的是,它目前正在按照我的意愿行事,但我无法想象这是处理这种情况的适当方式。

我正在寻找建议(或可能是嘲笑)正确的方法来线程化这个COM对象,这样它就不会干扰我的UI操作。

谢谢,

bstiffler

0 个答案:

没有答案