COM对象 - 线程 - .net

Ant*_*eco 5 .net com multithreading backgroundworker

有没有办法在一个全新的线程中执行一个com对象的方法,而不是附加到主线程?我已经尝试过使用backgrounWorker,甚至使用新的线程Dim thr as new Thread(AddressOf blah),但是没有工作.我没有在任何地方引用COM对象,而是在线程函数"blah"或backgroundWorker的DoWork方法中,但是当我尝试处理我调用的COM对象的方法时,我的主UI仍然锁定.

我真的需要让它在一个单独的线程中从com对象执行方法,因为它导致我的整个应用程序锁定.

下面是我使用方法"DoWork"的Thread的示例.可以为后台工作者采用相同的逻辑

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
Run Code Online (Sandbox Code Playgroud)

即使它应该在一个全新的线程上运行,一旦它执行scan.open我的主线程锁定直到它完成.

我感谢任何帮助.

Han*_*ant 6

COM负责处理ThreadingModel注册表项在注册表中发布的对象的线程要求.你的显然是"公寓",这使得COM代表对象处理线程安全.这很常见.是的,如果您在UI线程上创建它,那么COM会将您的工作线程的调用编组回UI线程.

要绕过它,您必须创建一个单独的STA线程,以便为该对象提供另一个线程安全的主页.这需要创建一个Thread,调用它的SetApartmentState()方法使其成为STA并调用Application.Run()来运行消息循环.这本身很难处理,因为你失去控制,你需要一个Form或Timer或Control.BeginInvoke()来生成让你使用对象方法的事件.这一切都非常不愉快,沙漏光标在过去很受欢迎.