В System.Net.WebSockets отсутствуют сообщения/уведомленияC#

Место общения программистов C#
Ответить
Anonymous
 В System.Net.WebSockets отсутствуют сообщения/уведомления

Сообщение Anonymous »

Я создаю библиотеку для прослушивания уведомлений сервера (более 100 000 запросов в час), при использовании WebSocketSharp он получает все 100 000 уведомлений, но происходит утечка памяти (сервер теряет память через пару часов).
При использовании System.Net.WebSockets память очищается правильно (без утечки памяти), но я получаю только 60 000 уведомлений (некоторые сообщения отсутствует).
Я использую функция ниже для получения уведомления (изменение параметров и буфера не помогло):
async Task Receive()
{
Task RunningTask = Task.Factory.StartNew(async () =>
{
await HandleMessage(channel.Reader);
});
while (WebSocket.State == WebSocketState.Open)
{
try
{
//var buffer = new byte[256];
var maxSize = BufferSize;
var framePayload = new Memory(new byte[maxSize]);
var buffer = new Memory(new byte[maxSize / 2]);
ValueWebSocketReceiveResult result;
DateTime receiveTime = DateTime.Now;
int framePayloadSize = 0;
do
{
result = await WebSocket.ReceiveAsync(buffer, CancellationToken.None);
receiveTime = DateTime.Now;
var data = buffer.Slice(0, result.Count);
if (framePayloadSize + result.Count > maxSize)
{
var tempFramePayload = new Memory(new byte[maxSize]);
framePayload.CopyTo(tempFramePayload);
maxSize *= 2;
framePayload = new Memory(new byte[maxSize]);
tempFramePayload.CopyTo(framePayload);
}
data.CopyTo(framePayload.Slice(framePayloadSize, result.Count));
framePayloadSize += result.Count;
} while (!result.EndOfMessage);

if (result.Count != 0)
{
try
{

if (result.MessageType == WebSocketMessageType.Close)
{
_log.LogInformation("DotNetWS Message Close.");
await WebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, null, CancellationToken.None);
channel.Writer.Complete();
}
else
{
await channel.Writer.WriteAsync(new() { Payload = framePayload, PayloadSize = framePayloadSize });
}
}
catch (Exception ex)
{
_log.LogError("DotNetWS Error: {ErrorMessage}", ex.Message);
}
}
}
catch (Exception e)
{
_log.LogError("DotNetWS Error: {ErrorMessage}", e.Message);
}
}
_log.LogInformation("DotNetWS Channel is closed");
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... ifications
Ответить

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

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

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

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

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