VB .net использует Async и ожидает, пока true loop блокирует пользовательский интерфейс

#vb.net #winforms #asynchronous #async-await

#vb.net #winforms #асинхронный #async-ожидание

Вопрос:

У меня есть VB.net приложение winform, которое я пишу с помощью WebSocketClient, я искал несколько дней, чтобы найти некоторые документированные ответы на этот конкретный вопрос, но не нашел ничего, что я мог бы использовать.

Мой класс Async / await, который используется для связи с удаленным сервером, использует ряд операторов await, в основном sendasync и receiveasync. Приложение аналогично по функциональности приложениям типа SignalR для общения в чате.

Я успешно подключаюсь к URI, получаю приветственное сообщение и аутентифицируюсь, все еще используя Async / Await. Кнопка в форме, которая запускает WebSocketClient, также преобразуется в асинхронный метод с WebSocketClient «ожидаемый».

Затем я перехожу в цикл while / true, который должен позволить пользователю отправлять запросы и получать обратную связь с удаленного сервера.

Проблема, с которой я сталкиваюсь, заключается в том, что пользовательский интерфейс блокируется, и когда пользователь пытается отправить запрос с помощью нажатия кнопки, он полностью не отвечает.

Мне удалось добиться некоторого успеха с фоновыми рабочими, но я хочу использовать метод Async / Await, поскольку он широко считается более современным подходом.

Я не могу понять, как я получаю структуру Async / await для эмуляции цикла while, если у меня нет окончательного await, реализующего цикл while, который, я уверен, противоречит дизайну Async / await и, вероятно, также будет заблокирован.

Кто-нибудь может помочь мне преодолеть это препятствие, пожалуйста?

спасибо всем,

Джон

                While True

                If jsonRequestText <> "" Then

                    jsonResponseText = Encoding.UTF8.GetString(bytesReceived.Array, 0, result.Count)
                    bytesToSend = New ArraySegment(Of Byte)(Encoding.UTF8.GetBytes(jsonRequestText))

                    Await ws.SendAsync(bytesToSend, WebSocketMessageType.Text, True, Threading.CancellationToken.None)
                    bytesReceived = New ArraySegment(Of Byte)(New Byte(1023) {})
                    result = Await ws.ReceiveAsync(bytesReceived, Threading.CancellationToken.None)
                    jsonResponseText = Encoding.UTF8.GetString(bytesReceived.Array, 0, result.Count)
                    jsonRequestText = ""

                End If

                If jsonResponseText <> "" Then

                    Await ConsumeResponseAsync(jsonResponseText)
                    jsonResponseText = ""

                End If

            End While
  

Я использую websocketclient, и как только я подключаюсь и аутентифицируюсь, я попадаю в опубликованный цикл. Я изо всех сил пытаюсь понять, как я реплицирую этот цикл с помощью подхода async await, т. Е. Без while / true.

Комментарии:

1. Вам нужно опубликовать свой код. Неясно, как цикл while / true может позволить пользователю отправлять запросы и получать отзывы . Поскольку вы используете WinForms, вы находитесь на платформе, управляемой событиями while(true) , циклы обычно не приветствуются, тем более при запуске в основном потоке.

2. I cannot work out how I get an Async/await structure to emulate the while loop — вы ожидаете на a TaskCompletionSource.Task , и когда происходит ваше событие, которое должно прервать цикл, вы сигнализируете TaskCompletionSource .

3. Спасибо, ребята, я начал собирать некоторый код для демонстрации, но его много, и мне действительно нужно было написать сокращенную версию, которую я начал — я полностью согласен, Джими, я действительно не хотел использовать while (true) — а затем я прочитал ответ GSerg, и этоя думаю, это направило меня именно туда, куда мне нужно было идти. еще раз спасибо обоим.