gpt4 book ai didi

vb.net - ActiveX 控件 '8856f961-340a-11d0-a96b-00c04fd705a2' 无法实例化,因为当前线程不在单线程单元中

转载 作者:行者123 更新时间:2023-12-01 16:24:02 28 4
gpt4 key购买 nike

当我尝试显示其中包含网络浏览器的表单时,出现此错误。

ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2”无法实例化,因为当前线程不在单线程单元中

我通过以下方式调用它:

Public Class frmMain
Class Server
Public Shared Sub Main()
Dim aTcpMessaging As IMessagingSystemFactory = New TcpMessagingSystemFactory()
Dim anInputChannel As IInputChannel = aTcpMessaging.CreateInputChannel(theIPforLocal & ":" & thePort)
Dim aStringMessagesFactory As IStringMessagesFactory = New StringMessagesFactory()
Dim aStringMessageReceiver As IStringMessageReceiver = aStringMessagesFactory.CreateStringMessageReceiver()
AddHandler aStringMessageReceiver.MessageReceived, AddressOf StringMessageReceived

aStringMessageReceiver.AttachInputChannel(anInputChannel)
End Sub

Private Shared Sub StringMessageReceived()
Call New frmMM().Show()
End Sub
End Class

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim RelState As Integer = 0
Call frmMain.Server.Main()
lblVer.Text = "V.7"
Pid = 0
End Sub
End Class

我怎样才能加载它,这样它就不会显示该错误?

谢谢。

大卫

代码更新

 Class Server
<STAThread()> Public Sub Main()
Dim aTcpMessaging As IMessagingSystemFactory = New TcpMessagingSystemFactory()
Dim anInputChannel As IInputChannel = aTcpMessaging.CreateInputChannel(theIPforLocal & ":" & thePort)
Dim aStringMessagesFactory As IStringMessagesFactory = New StringMessagesFactory()
Dim aStringMessageReceiver As IStringMessageReceiver = aStringMessagesFactory.CreateStringMessageReceiver()
AddHandler aStringMessageReceiver.MessageReceived, AddressOf StringMessageReceived

aStringMessageReceiver.AttachInputChannel(anInputChannel)
End Sub

Private Shared Sub StringMessageReceived()
Call New frmMM().Show()
End Sub
End Class

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim RelState As Integer = 0
Call frmMain.Server.Main() '<-- the error now
lblVer.Text = "V.7"
Pid = 0
End Sub
End Class

最佳答案

出现此问题的原因是在非 UI 线程上创建 UI 组件。这是代码的简化版本,它将因此错误消息而中断。

Imports System.ComponentModel

Public Class Form1
Private _ThreadedProcesss As ThreadedProcess
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
_ThreadedProcesss = New ThreadedProcess()
_ThreadedProcesss.Start()
End Sub

Public Class ThreadedProcess
Private _thread As System.Threading.Thread

Public Sub Start()
_thread = New System.Threading.Thread(AddressOf ThreadEntryPoint)
_thread.Name = "Testing thread"
_thread.Start()
End Sub

Private Sub ThreadEntryPoint(status As Object)
Dim wb As New WebBrowser()
wb.Dock = DockStyle.Fill
wb.Visible = True
wb.DocumentText = "Hello world"
End Sub
End Class
End Class

要解决此问题,您只需在创建控件之前返回到 UI 线程即可。

Imports System.ComponentModel

Public Class Form1
Private _ThreadedProcesss As ThreadedProcess
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
_ThreadedProcesss = New ThreadedProcess(New EventHandler(AddressOf ThreadedProcess_Create))
_ThreadedProcesss.Start()
End Sub

Private Sub ThreadedProcess_Create(sender As Object, e As System.EventArgs)
If (Me.InvokeRequired) Then
Me.Invoke(New EventHandler(AddressOf ThreadedProcess_Create), {sender, e})
Else
Dim wb As New WebBrowser()
Me.Controls.Add(wb)
wb.Dock = DockStyle.Fill
wb.Visible = True
wb.DocumentText = "Hello world"
End If
End Sub

Public Class ThreadedProcess
Private _thread As System.Threading.Thread
Private _callback As EventHandler

Public Sub New(callback As EventHandler)
_callback = callback
End Sub

Public Sub Start()
_thread = New System.Threading.Thread(AddressOf ThreadEntryPoint)
_thread.Name = "Testing thread"
_thread.Start()
End Sub

Private Sub ThreadEntryPoint(status As Object)
_callback.Invoke(Me, EventArgs.Empty)
End Sub
End Class
End Class

因此,对于您的示例,我相信代码将是:

 Class Server
Private _callback as EventHandler
Public Sub Main(callback as EventHandler)
_callback = callback
Dim aTcpMessaging As IMessagingSystemFactory = New TcpMessagingSystemFactory()
Dim anInputChannel As IInputChannel = aTcpMessaging.CreateInputChannel(theIPforLocal & ":" & thePort)
Dim aStringMessagesFactory As IStringMessagesFactory = New StringMessagesFactory()
Dim aStringMessageReceiver As IStringMessageReceiver = aStringMessagesFactory.CreateStringMessageReceiver()
AddHandler aStringMessageReceiver.MessageReceived, AddressOf StringMessageReceived

aStringMessageReceiver.AttachInputChannel(anInputChannel)
End Sub

Private Sub StringMessageReceived()
_callback.Invoke(Me, EventArgs.Empty)
End Sub
End Class

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim RelState As Integer = 0
Call frmMain.Server.Main(new EventHandler(AddressOf Server_MessageReceived)) '<-- the error now
lblVer.Text = "V.7"
Pid = 0
End Sub
Private Sub Server_MessageReceived(sender as Object, e As EventArgs)
If (Me.InvokeRequired) Then
Me.Invoke(New EventHandler(AddressOf Server_MessageReceived), {sender, e})
Else
Call New frmMM().Show()
End If
End Sub
End Class

关于vb.net - ActiveX 控件 '8856f961-340a-11d0-a96b-00c04fd705a2' 无法实例化,因为当前线程不在单线程单元中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8783863/

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