Как обрабатывать ответы на сообщения через (асинхронное) сетевое взаимодействие (VB.NET) - PullRequest
0 голосов
/ 20 июля 2009

Я пишу приложение, которое отправляет сообщения по сети на другой ПК, который обрабатывает сообщение и отправляет ответ (например, логическое значение или некоторые другие данные). Мои сетевые коммуникационные подпрограммы (на основе 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, который будет его ждать).

Возможно, есть лучший способ сделать это - есть идеи?

1 Ответ

1 голос
/ 21 июля 2009

Что если вы завернете все это в классе? Тогда идея заключается в том, что у вас будет только один объект "NetComm" в каждом экземпляре. Скажем, вы называете класс MessagingUtility. И всякий раз, когда вы хотите отправить новое сообщение, вам нужно будет позвонить

Dim myMessage As New MessagingUtility()
myMessage.NetSendMessage("Hello World")

Или что-то в этом роде.

Это предотвратит любую возможность потери вами контекста сообщения, когда в это же время отправляется много других сообщений. Потому что, в конце концов, каждое свойство данного сообщения, которое вам когда-либо понадобится, будет аккуратно помещено в объект myMessage.

...