gpt4 book ai didi

.net - COM 对象 - 线程 - .net

转载 作者:行者123 更新时间:2023-12-04 18:51:33 24 4
gpt4 key购买 nike

有没有办法在一个全新的线程中执行一个 com 对象的方法,而不是附加到主线程?我曾尝试使用 backgrounWorker,甚至通过执行 Dim thr as new Thread(AddressOf blah) 使用新线程并且都不起作用。我没有在任何地方引用 COM 对象,而是在线程函数“blah”或 backgroundWorker 的 DoWork 方法内,但我的主 UI 在尝试处理我正在调用的 COM 对象的方法时仍然锁定。

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

下面是使用“DoWork”方法的线程示例。后台 worker 可以采用相同的逻辑

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 线程来为对象提供另一个线程安全的 home。这需要创建一个线程,调用其 SetApartmentState() 方法使其成为 STA 并调用 Application.Run() 来运行消息循环。这本身就很难处理,因为您失去了控制,您需要一个 Form 或 Timer 或 Control.BeginInvoke() 来生成允许您使用对象方法的事件。这一切都非常令人不快,沙漏光标在过去很流行。

关于.net - COM 对象 - 线程 - .net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5383191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com