ネットワーク経由でメッセージを処理し、返信 (ブール値やその他のデータなど) を返す別の PC にメッセージを送信するアプリを作成しています。私のネットワーク通信サブシステム (WCF ベース) は、他の PC にメッセージを送信し、受信したメッセージを処理する機能を提供します。
問題は、受信したすべての応答が、指定されたネットワーク メッセージ イベント ハンドラー サブによって処理されることですが、元のメッセージの送信を要求したサブにフィードバックする方法がありません。
簡単に説明すると、状況は次のようになります。
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 に) 返します。
おそらくこれを行うためのより良い方法があります-何かアイデアはありますか?