Я создаю библиотеку для прослушивания уведомлений сервера (более 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
В System.Net.WebSockets отсутствуют сообщения/уведомления ⇐ C#
Место общения программистов C#
-
Anonymous
1761376774
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");
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79798942/system-net-websockets-is-missing-messages-notifications[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия