COM对象-线程-.net
有没有办法在一个全新的线程中执行com对象的方法,而不是附加到主线程?我尝试过使用一个后台工作人员,甚至使用了一个新线程,方法是将COM对象-线程-.net,.net,multithreading,com,backgroundworker,.net,Multithreading,Com,Backgroundworker,有没有办法在一个全新的线程中执行com对象的方法,而不是附加到主线程?我尝试过使用一个后台工作人员,甚至使用了一个新线程,方法是将Dim thr作为新线程(AddressOf blah),但都不起作用。我不是在任何地方引用COM对象,而是在线程函数“blah”或backgroundWorker的DoWork方法中引用,但是当我的主UI试图处理我调用的COM对象的方法时,它仍然会锁定 我真的需要让它在一个单独的线程中执行com对象中的方法,因为这会导致我的整个应用程序被锁定 下面是我使用“DoWo
Dim thr作为新线程(AddressOf blah)
,但都不起作用。我不是在任何地方引用COM对象,而是在线程函数“blah”或backgroundWorker的DoWork方法中引用,但是当我的主UI试图处理我调用的COM对象的方法时,它仍然会锁定
我真的需要让它在一个单独的线程中执行com对象中的方法,因为这会导致我的整个应用程序被锁定
下面是我使用“DoWork”方法的线程示例。后台工作人员也可以采用相同的逻辑
Public Sub Reconnect_Scanner() Implements Scanners.Reconnect_Scanner
'Do our request on a new thread
Dim thread As New System.Threading.Thread(AddressOf Connect)
thread.SetApartmentState(Threading.ApartmentState.STA)
thread.Start()
End Sub
Public Sub Connect()
'Get a new instance of our scanner
Dim scanner As New OposScanner_CCO.OPOSScanner
'Loop until scanner is opened
Do
Debug.Print("looking for scanner")
'If we find the device, exit do
Dim openId As Integer = scanner.Open("Honeywell")
If openId = 0 Then Exit Do
'Sleep 1 second
System.Threading.Thread.Sleep(250)
Loop
End Sub
即使它应该在一个全新的线程上运行,一旦它运行scanner.open,我的主线程就会被锁定,直到它完成
非常感谢您的帮助。COM负责按照ThreadingModel注册表项在注册表中发布的对象线程要求。显然,您的是“单元”,这使COM代表对象处理线程安全。这很常见。是的,如果您在UI线程上创建了它,那么COM会将来自工作线程的调用封送回UI线程
要绕过这一点,您必须创建一个单独的STA线程,为对象提供另一个线程安全的主线程。这需要创建一个线程,调用其SetApartmentState()方法使其成为STA,并调用Application.Run()运行消息循环。这本身很难处理,因为如果您失去控制,您将需要一个窗体、计时器或控件。BeginInvoke()来生成允许您使用对象方法的事件。这一切都很令人不快,沙漏光标在过去很流行。在工作线程中创建COM组件,这样您的COM方法就不会出现在主UI线程中。除了Application.Run()部分之外,我已经说到了这一切,但当我创建了一个新线程并将appartment状态设置为STA。。。我会附上我的代码,以便更好地解释我正在做什么和扫描仪。开放线是什么被锁定。有什么建议吗?(在此之后编辑我的问题以包含我的编码)不调用应用程序。线程中运行是导致它锁定的原因。COM服务器期望在一个线程上运行,该线程会产生一个消息循环,它们依赖于此。例如,他们将使用计时器。检查这个(不合适的)例子:我设法找到了一个我能够调整的全COM端口连接器源代码,这样我就不需要使用外部COM对象了。不过,我相信这最终会成为一个问题,因为我一直在使用第三方com对象,所以我非常感谢您的帮助,下次遇到这个问题时,我会尝试一下。谢谢你的帮助!