2009-07-20 14 views
0

メッセージを処理している別のPCにネットワーク経由でメッセージを送信し、返信を返すアプリケーションを作成しています(ブール値など)データ)。ネットワーク通信サブシステム(WCFベース)は、他のPCにメッセージを送信し、受信したメッセージを処理する機能を提供します。(非同期)ネットワーク通信(VB.NET)でメッセージの応答を処理する方法

受信したすべての応答は、指定されたネットワークメッセージイベントハンドラサブで処理されるという問題がありますが、送信元のメッセージを呼び出すサブに戻す方法はありません。

Private Function NetSendMessage(ByVal message As String) As Boolean 
    'Send network message to PC with device connected 
    '.... 
    'returns true if message sent 
End Function 

Private Sub NetMessageReceived(ByVal sender As Object, ByVal e As MessageEventArgs) Handles NetComm.OnReceiveMessage 
    'Handles incoming messages 
    '.... 
End Sub 

Private Function MoveForward() As Boolean 
    Return (MoveLeftWheel() And MoveRightWheel()) 
End Function 

Private Function MoveLeftWheel() As Boolean 
    If NetSendMessage("MoveLeftWheel") = False Then Return False 

    'Network message went through, now we need to know if the command was executed, which the remote PC will tell us 
    Return ______ *(here is the trouble-- how do I get the boolean response from the other side as to whether this worked or not?)* 
End Function 

Private Function MoveRightWheel() As Boolean 
    If NetSendMessage("MoveRightWheel") = False Then Return False 

    Return ______ 
End Function 

私がこれまで考えてきたソリューションは、これはおそらく必要以上に複雑です:

はすぐに状況がこのようなもので、説明するために。

私が持っていたアイデアの1つは、各メッセージ(その応答に相手側が含まれる)を識別するためのID番号を追加し、次に「メッセージキュー」用のArrayListを作成することでした。 NetMessageReceivedサブクラスは新しいメッセージをこのArrayListに追加し、応答を必要とする関数はその応答が到着したかどうかを確認するためにキューを監視します。

Private NetMessageQueue as New ArrayList 
Private LatestMessageID as Integer 

Private Sub NetMessageReceived(ByVal sender As Object, ByVal e As MessageEventArgs) Handles NetComm.OnReceiveMessage 
    'Handles incoming messages 
    NetMessageQueue.Add(e.Message.ToString) 
End Sub 

Private Function MoveLeftWheel() As Boolean 
    'Send network message to robot PC 

    Private MyMessageID as Integer = LatestMessageID + 1 

    NetSendMessage(MyMessageID & "|" & "MoveLeftWheel") 

    Do 
      For Each msg As String in NetMessageQueue 
        If msg.Split("|")(0) = MyMessageID.ToString Then 
          'This is the response message we're waiting for 
          Return Boolean.Parse(msg.Split("|")(1)) 
        End If 
      Next 
    Loop 
End Function 

これは、これを行うには非常に面倒な/不必要な課税方法のようです。私は、おそらくMoveRightWheelが呼び出すことができるNetSendReceive関数を追加する行に沿って考えていました。 NetSendReceiveはNetSendMessageを呼び出し、(おそらくデリゲート/ IAsyncResultを介して)その応答のメッセージキューを監視し、応答メッセージ(それを待つMoveRightWheelに返す)を返します。

これを行うには、おそらくもっと良い方法はありますか?

答えて

1

これをすべてクラスにラップするとどうなりますか?次に、各インスタンスに「NetComm」オブジェクトが1つしかないという考えがあります。あなたがクラスMessagingUtilityを呼び出したとします。新しいメッセージを送信する場合は、いつでも電話する必要があります。

またはそのようなものです。

これは、他の多くのメッセージが同じ時刻に送信されているときに、メッセージのコンテキストを失う可能性を防止します。結局のところ、指定したメッセージのすべてのプロパティは、myMessageオブジェクトにきちんと含まれています。