COM对象-线程-.net

COM对象-线程-.net,.net,multithreading,com,backgroundworker,.net,Multithreading,Com,Backgroundworker,有没有办法在一个全新的线程中执行com对象的方法,而不是附加到主线程?我尝试过使用一个后台工作人员,甚至使用了一个新线程,方法是将Dim thr作为新线程(AddressOf blah),但都不起作用。我不是在任何地方引用COM对象,而是在线程函数“blah”或backgroundWorker的DoWork方法中引用,但是当我的主UI试图处理我调用的COM对象的方法时,它仍然会锁定 我真的需要让它在一个单独的线程中执行com对象中的方法,因为这会导致我的整个应用程序被锁定 下面是我使用“DoWo

有没有办法在一个全新的线程中执行com对象的方法,而不是附加到主线程?我尝试过使用一个后台工作人员,甚至使用了一个新线程,方法是将
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对象,所以我非常感谢您的帮助,下次遇到这个问题时,我会尝试一下。谢谢你的帮助!