Как остановить асинхронный код TCP .NET от использования ресурсов всей системы

В некотором коде асинхронного сервера TCP, который у меня есть, иногда возникает ошибка, из-за которой процесс потребляет всю память системы. При просмотре журналов, средства просмотра событий и некоторых документов MSпроблема возникает, если " вызывающее приложение выполняет вызовы асинхронного ввода-вывода к одному и тому же клиенту несколько раз, тогда вы можете ee фрагментация кучи и частный байт увеличиваются, если удаленный клиент останавливает свой конец ввода-вывода», что приводит к скачкам использования памяти и закреплению структуры System.Threading.OverlappedData и массивов байтов.

Предлагаемое в статье базы знаний решение состоит в том, чтобы «установить верхнюю границу количества ожидающих буферов (отправляемых или получаемых) с их асинхронным вводом-выводом.

Как это сделать? Имеется ли в виду byte[], которые отправляются в BeginRead? То есть решение просто заключает byte[] доступа в семафор?

РЕДАКТИРОВАТЬ: семафор контролирует доступ к byte буферы или просто наличие пула байтовых буферов статического размера - два распространенных решения.Озабоченность, которая у меня есть, которая все еще остается, заключается в том, что когда возникает эта проблема с асинхронным клиентом (возможно, на самом деле это какое-то странное сетевое событие), наличие семафоров или пулов байтовых буферов не позволит мне запустить не хватает памяти, но это не решает проблему. Мой пул буферов, скорее всего, будет поглощен проблемным клиентом (ами), фактически блокируя правильные функции законных клиентов.

РЕДАКТИРОВАТЬ 2: Наткнулся на это замечательное answer. По сути, он показывает, как вручную откреплять объекты. И хотя асинхронный код TCP оставляет закрепление за кулисами правил времени выполнения, может быть возможно переопределить это, явно закрепив каждый буфер перед использованием, а затем открепив в конце блока или в фине лли. Я сейчас пытаюсь это понять...

8
задан Community 23 May 2017 в 11:43
поделиться