0

共有サブのIP呼び出しからフォームのラベルにステータスを渡そうとしています。

これは私が使用している現在のコードです:

Class Server
    <STAThread()> Public Shared Sub Main()
        Dim aTcpMessaging As IMessagingSystemFactory = New TcpMessagingSystemFactory()
        Dim anInputChannel As IInputChannel = aTcpMessaging.CreateInputChannel(theIPforLocal & ":" & thePort)
        Dim aStringMessagesFactory As IStringMessagesFactory = New StringMessagesFactory()
        Dim aStringMessageReceiver As IStringMessageReceiver = aStringMessagesFactory.CreateStringMessageReceiver()
        AddHandler aStringMessageReceiver.MessageReceived, AddressOf StringMessageReceived

        aStringMessageReceiver.AttachInputChannel(anInputChannel)
    End Sub

    Private Shared Sub StringMessageReceived(ByVal sender As Object, ByVal e As StringMessageEventArgs)
        LANResponse = Convert.ToString(e.Message)
        Dim lanSent As String() = Nothing
        Dim sep(3) As Char
        Dim s As String = ""

        sep(0) = "~"
        'sep(1) = ","
        lanSent = LANResponse.Split(sep, 2)

        Dim a As New Threading.Thread(AddressOf getStatus)

        a.SetApartmentState(Threading.ApartmentState.STA)
        a.Start(Trim(lanSent(0)) & Trim(lanSent(1)))
  End Sub
End Class

Private Shared Sub getStatus(ByVal data As Object)
    lblStatus.text = ("Static: " & data)
End Sub

それが私に与えるエラーは、行lblStatus.text =( "Static:"&data)にあります

エラー1クラスの明示的なインスタンスがないと、共有メソッドまたは共有メンバー初期化子内からクラスのインスタンスメンバーを参照できません。

どんな助けでも素晴らしいでしょう!

デビッド

アップデート

追加後:

Private Sub getStatus(ByVal data As Object)
    If InvokeRequired Then
        Invoke(New Action(Of Object)(AddressOf getStatus), data)
    Else
        lblStatus.Text = ("Static: " & data)
    End If
End Sub

このエラーは1行も表示されませんDimaAs New Threading.Thread(AddressOf getStatus)

エラー1次の引数でアクセス可能な'New'を呼び出すことができないため、オーバーロードの解決に失敗しました:'Public Sub New(start As System.Threading.ParameterizedThreadStart)':非共有メンバーへの参照にはオブジェクト参照が必要です。'Public Sub New(start As System.Threading.ThreadStart)':メソッド'Private Sub getStatus(data As Object)'には、デリゲート'Delegate Sub ThreadStart()'と互換性のある署名がありません。

4

2 に答える 2

1

Sharedメンバーを使用してこれを機能させようとしていることに気付きました。これは、次の理由で問題になる可能性があります。

(1) がなければ、Shared舞台裏で参照変数が作成され、呼び出されMeます。を介して、 などにMeアクセスできます。実際には、必ずしも に入れる必要はなく、それ自体で指定できます。しかし、それ自体でも、そこに暗示され、まだ使用されています。lblStatusMe.lblStatusMelblStatusMe

(2) 保証付きShared、保証書はありませんMe。がないと、コンパイラが識別するインスタンスMeがないlblStatusため、エラーが発生します。アクセス元の Form への参照を渡す方法を見つける必要がありますlblStatus。ただし、メイン スレッド以外のスレッドから Label やその他のユーザー インターフェイス クラスを直接更新することは、何か悪いことと見なされることに注意する必要があります。これは、WinForms がスレッド セーフではないためです。.NET Framework 2 以降、試行するとエラーが発生します (ただし、自己責任でこのエラーをオプトアウトすることは可能です)。

これらは C# 用ですが、続行する方法についていくつかのアイデアが得られる場合があります。

C#で別のスレッドからGUIを更新するには?

http://www.codeproject.com/Articles/23517/How-to-Properly-Handle-Cross-thread-Events-and-Upd

したがって、ステップ 1 は、getStatus を共有メンバーではなくすることです。これにより、Me.

ステップ 2 は、次のように、ラベルにテキストを取得するためのスレッドセーフな形式に getStatus を再設計することです。

Private Sub getStatus(ByVal data As Object)
    If InvokeRequired Then
        Invoke(New Action(Of Object)(AddressOf getStatus), data)
    Else
        lblStatus.Text = ("Static: " & data)
    End If
End Sub

ステップ 3 は、フォームへの参照を取得する方法を見つけることServerです。共有 ArrayList 経由でしょうか? それとも、フォームへの共有参照ですか?

ステップ 4 は StringMessageReceived の再設計であり、そのAddressOf部分が の形式になりましたAddressOf refToMyForm.getStatus

于 2012-04-16T21:16:15.260 に答える