作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我设计了一个异步套接字客户端,连接后我调用了这个 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
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.
Public Class Program
<STAThread()> _
Shared Sub Main()
Dim frm As New MainDialog
Application.Run(frm)
End Sub
End Class
MainDialog.SetStatus("Connected")
If MainDialog.InvokeRequired Then <-- This line gives the same error as above
MainDialog.Invoke(New LoginDelegate(AddressOf ShowLogin), "Connected")
End If
Private Delegate Sub LoginDelegate(ByVal Item As Object)
最佳答案
您不应该在工作线程中更新 UI。都不是MainDialog.SetStatus
也不是 loginDlg.ShowDialog
在工作线程中是一件有效的事情。
理想情况下,您应该在 UI 线程中调用它。您可以调用 Control.Invoke
或 Control.BeginInvoke
.
引用 How to update the GUI from another thread in C#?
关于.net - 在 onconnect 例程中调用 winform 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29075464/
我是一名优秀的程序员,十分优秀!