Утечка памяти в перекрывающихся данных на сокетах

Я использую Async Socket для установления соединения между клиентом и сервером с помощью документов MSDN:

https://msdn.microsoft.com/en-us/library/fx6588te(v=vs.100).aspx

https://msdn.microsoft.com/en-us/library/bew39x2a(v=vs.100).aspx

Я начал с Синхронного, а затем с Асинхронного. После успешного завершения моего первого приложения я начал искать в репозиториях GitHub больше кода и больше объяснений. Я нашел это:

https://github.com/perrybutler/csharpsockets

И это хорошо, это работает, но у него есть утечка памяти, и я начал Profiling, я нашел это:

введите описание изображения здесь

(Возможная утечка памяти)

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

(С Cycle Detected statments повсюду. Понимаю, что они значат. Я полагаю, что приложение или GC принудительно остановили его и пометили как цикл).

Я думаю, что-то не так, потому что, если вы отправляете около 1 МБ данных, память должна только увеличиться на 1 МБ, но позже уменьшится. Но этого не происходит. Я начал избавляться от всего, не вызывая исключения, но это не сильно помогло.

Я начал искать это в Stackru и в других местах, и я нашел это:

.NET не имеет надежной асинхронной сокетной связи?

Однако я не очень понимаю, что там обсуждается.

Я также нашел это:

https://www.codeproject.com/Articles/83102/C-SocketAsyncEventArgs-High-Performance-Socket-Cod

Я прочитал, что сокеты должны подтвердить, когда он уже отправляет данные между BeginSend/EndSend & BeginReceive/EndReceive, потому что если нет, он будет ждать этого и начнет увеличивать память (пока не будет обнаружен цикл?)

Может быть, с CodeProject, которым я поделился, я должен получить это? Я не знаю, с чего мне начать.

Мне нужно руководство для этого. Я постараюсь профилировать CodeProject.

1 ответ

У меня была такая же проблема, мой неправильный код:

      NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);

Фиксированный код:

      using (NetworkStream stream = client.GetStream())
{
    stream.Write(data, 0, data.Length);
} 
Другие вопросы по тегам