Ожидание ClientWebSocket.RecieveAsync в .net никогда не возвращается снова после возврата только один разC#

Место общения программистов C#
Ответить
Anonymous
 Ожидание ClientWebSocket.RecieveAsync в .net никогда не возвращается снова после возврата только один раз

Сообщение Anonymous »

Я использую класс System.Net.WebSockets.ClientWebSocket на C# в .NET 6.0.
У меня есть поток, который будет неоднократно опрашивать этот ClientWebSocket, вызывая функция.

Код: Выделить всё

poll_thread = new Thread(poll);
poll_thread.Start();
Функции опроса выглядят следующим образом:

Код: Выделить всё

        private async void poll() {
while (true) {
// Wait 16 ms (1/60 of a second) before making another polling attempt.
Thread.Sleep(16);

switch (web_socket.State) {
case WebSocketState.Open: {
if (socket_connected == false) { socket_connected = true; }
try {
// RecieveAsync automatically polls and recieves the packet.
Memory memory = new Memory(new Byte[1024]);
Console.WriteLine("Awaiting started");
ValueWebSocketReceiveResult result = await web_socket.ReceiveAsync(memory, CancellationToken.None);
Console.WriteLine("Awaiting ended");
// Only attempt deserialization if a packet was recieved, aka the buffer is not empty.
if (result.Count != 0) {
deserialize_event(memory.Slice(0, result.Count).ToArray());
}
} catch (Exception exception) {
Console.WriteLine("Pusher polling error: " + exception.ToString());
}
} break;
case WebSocketState.Closed: {
connection_closed(web_socket.CloseStatus);
} break;
}
}
}
Предполагается, что он будет постоянно опрашивать веб-сокет.
Вывод консоли
Как видно из вывода консоли, после первого получения данных и попытки опроса опять же, результат ValueWebSocketReceiveResult = await web_socket.ReceiveAsync(memory, CancellationToken.None); фактически никогда не завершает ожидание.
Если программа остается запущенной, в конечном итоге она вызывает исключение в этой строке

Код: Выделить всё

System.Net.WebSockets.WebSocketException: 'The remote party closed the WebSocket connection without completing the close handshake.'
Я не понимаю, почему моя реализация не работает, поскольку это реализация, перенесенная из WebSocketPeer Godot Engine.
Реализация GDScript выглядит аналогично реализация C#.

Код: Выделить всё

func poll() -> void:
socket.poll()
match socket.get_ready_state():
WebSocketPeer.STATE_OPEN:
while socket.get_available_packet_count():
if not socket_connected:
socket_connected = true
call(&"emit_signal", &"connection_established")

var packet: PackedByteArray = socket.get_packet()
print(packet.size())
handle_event(packet)
WebSocketPeer.STATE_CLOSING:
# Keep polling to achieve proper close.
return
WebSocketPeer.STATE_CLOSED:
socket_connected = false
call(&"emit_signal", &"connection_closed", socket.get_close_code())
Эта версия работает идеально, как и предполагалось, она получает все пакеты информации должным образом, подключаясь с той же конфигурацией, но смысл этого проекта в том, чтобы не использовать Godot Engine внутри это, так что это одна вещь, которую портируют.

Подробнее здесь: https://stackoverflow.com/questions/788 ... r-returnin
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»