#c# #websocket #system.net.websockets
#c# #websocket #system.net.websockets
Вопрос:
Я сталкиваюсь с проблемами в установке, которая находится под нагрузкой, принимая соединение и настраивая его на ОТКРЫТИЕ до того, как сервер будет считан для чтения из сокета.
Пример (не фактический код):
while (true) {
var objContext = HttpListenerContext.GetContext();
if (objContext.Request.IsWebSocketRequest){
var WebSocket = (await HttpListenerContext.AcceptWebSocketAsync(null)).WebSocket;
while (WebSocket.State == WebSocketState.Open) {
var buffer = new byte[BUFFERSIZE];
var result = await WebSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken);
....
}
}
}
При добавлении точек останова на клиенте и сервере, которые я заметил после вызова AcceptWebSocketAsync, клиенты получают, что соединение «ОТКРЫТО» и готово к использованию, и начинают отправлять данные.
Проблема в том, что ReceiveAsync еще не запущен в то время, причина в том, что ReceiveAsync немного медленнее запускает задачу, они остаются в режиме ожидания активации немного дольше, чем в неработающей системе из-за того, что рассматриваемый сервер находится под высокой нагрузкой (множество других задач / потоков и малое количествопроцессора).
Является ли это нормальным поведением и как это можно остановить?
Комментарии:
1. На веб-странице, вероятно, запущен java-код, и данные не будут возвращены до завершения java.
2. java не задействована
Ответ №1:
Если бы кто-то просмотрел мой код, этот человек обнаружил, что вызов ReceiveAsync, вызываемый позже, не является проблемой, информация находится в буфере.
Выше было указано, что обработчик событий был подключен слишком поздно.