gpt4 book ai didi

.net - 在 onconnect 例程中调用 winform 时出错

转载 作者:行者123 更新时间:2023-12-03 12:00:22 25 4
gpt4 key购买 nike

我设计了一个异步套接字客户端,连接后我调用了这个 OnConnect 例程。

目标是将主窗口中的状态文本设置为“已连接”,然后向用户 显示登录对话框。

Friend Sub OnConnect(ByVal ar As IAsyncResult)
Try
oSocket.EndConnect(ar)
MainDialog.SetStatus("Connected") <-- this line is giving the error

'We are connected so start listening for messages
byteData = New Byte(1023) {}
'Start listening to the data asynchronously
oSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, New AsyncCallback(AddressOf OnReceive), Nothing)
'// show login dialog
loginDlg = New LoginDialog
loginDlg.ShowDialog()
Catch ex As Exception
ShowMessage(String.Format(My.Resources.error_failed_reason, "connect", "server", ex.Message), MessageBoxIcon.Information)
End Try
End Sub

但我有一个异常(exception)

An error occurred creating the form. See Exception.InnerException for details. The error is: Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it.



我没有使用任何线程,只是异步套接字

什么可能导致此错误?
OnConnect 是在另一个线程中调用的吗?

编辑

我刚刚通过添加这个使我的应用程序成为单线程
Public Class Program
<STAThread()> _
Shared Sub Main()
Dim frm As New MainDialog
Application.Run(frm)
End Sub
End Class

编辑 2

我换了这条线
MainDialog.SetStatus("Connected")

有了这条线
If MainDialog.InvokeRequired Then  <-- This line gives the same error as above
MainDialog.Invoke(New LoginDelegate(AddressOf ShowLogin), "Connected")
End If

我在上面的模块中创建了这个委托(delegate)
Private Delegate Sub LoginDelegate(ByVal Item As Object)

最佳答案

您不应该在工作线程中更新 UI。都不是MainDialog.SetStatus也不是 loginDlg.ShowDialog在工作线程中是一件有效的事情。

理想情况下,您应该在 UI 线程中调用它。您可以调用 Control.InvokeControl.BeginInvoke .

引用 How to update the GUI from another thread in C#?

关于.net - 在 onconnect 例程中调用 winform 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29075464/

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