1

私の質問は少し複雑です:

私はソケットサーバーを持っています、そして私は2つのフォームを持っています。1つはサーバーのメインフォームで、もう1つはカスタムメイドのメッセージボックスです。リクエストがサーバーに到着すると、メインフォームは2番目のフォーム(メッセージボックス)を呼び出す必要があります。メインフォームを初めて開いたときは、すべて正常に機能します。しかし、アプリケーションを閉じずにメインフォームを閉じて再度開くと、サーバーにリクエストが届くと、カスタムメイドのメッセージボックスが開きますが、フリーズして次のようになります。

ここに画像の説明を入力してください

呼び出すためのコード:

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を返すプロパティと一致しています。したがって、呼び出しは発生せず、フォームはUIスレッドではなくワーカースレッドで作成されます。そのスレッドがメッセージループをポンピングしていないため、ドアネイルとして死んでいるところ。

これは常に、不正なフォームオブジェクトを渡すことによって発生します。「Form1」のように、オブジェクトではなくタイプであり、厄介なVB.NETトラップです。または、ユーザーが見ているものではなく、フォームオブジェクトの新しいインスタンスである「newForm1」を渡します。

Q&Dの修正は、代わりにApplication.OpenForms(0)を渡すことです。クリーンな修正は、ソケットで動作するクラスのコンストラクターに有効なフォーム参照を渡すことです。

于 2012-04-14T15:21:32.597 に答える