1

我的问题有点复杂:

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

在此处输入图像描述

调用代码:

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

1 回答 1

4

调试它。在 InvokeRequired 上设置断点。您知道这应该是正确的,因为该方法是从 I/O 完成线程调用的。您描述的问题与返回 False 的属性一致。所以 Invoke 不会发生,表单是工作线程而不是 UI 线程上创建的。由于该线程没有发送消息循环,因此它已经死了。

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

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

于 2012-04-14T15:21:32.597 回答