Я пишу приложение, которое отправляет сообщения по сети на другой ПК, который обрабатывает сообщение и отправляет ответ (например, логическое значение или некоторые другие данные). Мои сетевые коммуникационные подпрограммы (на основе WCF) просто дают мне возможность отправлять сообщения на другой ПК и обрабатывать все полученные сообщения.
Проблема заключается в том, что любой полученный ответ обрабатывается моим назначенным подпрограммой обработчика событий сетевого сообщения, но у меня нет возможности передать его обратно подпункту, который вызвал отправку исходного сообщения.
Чтобы быстро проиллюстрировать, ситуация выглядит примерно так:
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
Решения, о которых я думал до сих пор, являются более сложными, чем это, вероятно, должно быть.
Одна идея, которая у меня была, заключалась в том, чтобы добавить идентификационный номер для идентификации каждого сообщения (которое другая сторона включила бы в свой ответ), а затем у меня был бы 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
Это выглядит как очень громоздкий / излишне обременительный способ сделать это. Я думал о том, возможно, добавить функцию NetSendReceive, которая, скажем, может вызвать MoveRightWheel; NetSendReceive будет вызывать NetSendMessage, отслеживать очередь сообщений на предмет ее ответа (возможно, через делегат / IAsyncResult), а затем возвращать ответное сообщение (MoveRightWheel, который будет его ждать).
Возможно, есть лучший способ сделать это - есть идеи?