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

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

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

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

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

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

Ответы на вопрос(1)

Ваш ответ на вопрос