使用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