调用表单并冻结

时间:2012-04-14 14:45:55

标签: vb.net invoke

我的问题有点复杂:

我有Socket服务器,我有两种形式。一个是服务器的主要表单,另一个是自定义消息框。当请求到达服务器时,主窗体必须调用第二个窗体(messagebox)。当主表单第一次打开时,一切正常。但是,当我关闭主窗体而不关闭应用程序并再次打开它并请求来到服务器时,自定义消息框打开但它冻结并看起来像这样:

enter image description here

调用代码:

Private Delegate Sub DInvoke(ByRef Frm As Form, ByVal Text As String, ByVal Title As String, ByVal Socket As Integer, ByVal DataX As String, ByVal ReqForProfil As Boolean)

Public Sub ShowMessage(ByRef Frm As Form, ByVal Text As String, ByVal Title As String, ByVal Socket As Integer, ByVal DataX As String, ByVal ReqForProfil As Boolean)
    If Frm.InvokeRequired Then
        Dim DT As New DInvoke(AddressOf ShowMessage)
        Frm.Invoke(DT, New Object() {Frm, Text, Title, Socket, DataX, ReqForProfil})
    Else
        Messegar = New MessageFrm(Text, Title, Socket, DataX, ReqForProfil, True, 30)
        Messegar.Show()
    End If
End Sub

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:4)

调试它。在InvokeRequired上设置断点。您知道它应该是真的,因为从I / O完成线程调用该方法。您描述的问题与返回False的属性一致。因此Invoke不会发生,并且工作线程上的表单是创建的而不是UI线程。因为该线程没有引发消息循环,所以它作为一个伪造的死亡。

这总是由传递错误的表单对象引起的。就像“Form1”,一个类型而不是一个对象,一个令人讨厌的VB.NET陷阱。或者传递“new Form1”,这是表单对象的新实例,而不是用户正在查看的实例。

Q& D修复是通过Application.OpenForms(0)来代替。一个干净的解决方法是将有效的表单引用传递给与套接字一起使用的类的构造函数。