Парадигма запроса/ответа для библиотеки Websocketsharp с использованием Websocket.SendAsync() и функции обратного вызова OnMessage

Я пытаюсь реализовать парадигму запроса/ответа для библиотеки Websocketsharp точно так же, как она работает для асинхронного поведения запроса/ответа HttpClient. Я пытаюсь добиться этого, используя асинхронный обратный вызов, как указано в приведенном ниже коде. Я попытался заставить событие обратного вызова OnMessage метода SendAsync ждать, пока сервер не отправит ответ. Я могу получить ответ в рамках метода SendAsync, но как только мы выходим из области действия SendAsync, он очищает значение ответа.

string clientResponse = null;

            var response = Task.Run(() => objWSClient.SendAsync(stream, Convert.ToInt32(stream.Length), (async (completed) =>
            {
                if (completed)
                {
                    clientResponse = await WSMessageSendSuccess(reqObject, callback);

                    // Websocket response is flushed to the console window, but when it leaves the scope, it doesn't hold the response out of the SendAsync() scope.
                    Console.WriteLine(clientResponse);
                }
                else
                {
                    WSMessageSendFail(reqObject);
                    clientResponse = "Failure to send Message";
                }
            })));


            while (response.Status != TaskStatus.RanToCompletion)
            {
                Task.Delay(10000).Wait();
            }
            response.Wait();

            // As soon as we leave scope of WebSocket.SendAsync() method, it clears the client response variable value.
            // variable name : clientResponse;, it also works same with static property/variable.
            return clientResponse;

person Jits    schedule 22.09.2017    source источник
comment
Вы можете инкапсулировать API, следуя статье Microsoft, docs.microsoft.com/en-us/dotnet/standard/   -  person Lex Li    schedule 22.09.2017


Ответы (1)


person    schedule
comment
Извините за некрасивость. Это мое решение почти той же проблемы, что и ваша. Ответ сервера представляет собой объект JSON с идентификатором отслеживания в payload.i. Остальное говорит само за себя. - person Yoel Kohn; 25.09.2017
comment
Там тоже немного логики не хватает. Мой класс преобразует сообщение REST в полезную нагрузку WS. - person Yoel Kohn; 25.09.2017