2012-04-14 67 views
1

我的问题有点复杂:调用窗体并冻结

我有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 

任何帮助,将不胜感激!

回答

4

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

这通常是由传递一个错误的表单对象造成的。像“Form1”,一种类型而不是一个对象,一个讨厌的VB.NET陷阱。或者传递“新Form1”,这是表单对象的一个​​新实例,而不是用户正在查看的新实例。

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

+0

感谢Hans Passant的帮助。 Application.OpenForms解决了我的冻结问题。 – 2012-04-14 15:51:08