#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
— вы ожидаете на aTaskCompletionSource.Task
, и когда происходит ваше событие, которое должно прервать цикл, вы сигнализируетеTaskCompletionSource
.3. Спасибо, ребята, я начал собирать некоторый код для демонстрации, но его много, и мне действительно нужно было написать сокращенную версию, которую я начал — я полностью согласен, Джими, я действительно не хотел использовать while (true) — а затем я прочитал ответ GSerg, и этоя думаю, это направило меня именно туда, куда мне нужно было идти. еще раз спасибо обоим.