Cómo evitar que el código tcp .NET asíncrono utilice todos los recursos del sistema

En algunos códigos asíncronos del servidor TCP que tengo, ocasionalmente ocurre un error que hace que el proceso consuma toda la memoria del sistema. Al mirar los registros, el visor de eventos y algunosMS docs el problema ocurre si "la aplicación que realiza la llamada realiza llamadas IO asíncronas al mismo cliente varias veces, es posible que vea un aumento de la fragmentación del montón y el byte privado si el cliente remoto detiene su finalización de la E / S", lo que provoca picos en el uso de la memoria y la asignación de datos. de System.Threading.OverlappedData estructura y matrices de bytes.

La solución propuesta del artículo de KB es "establecer un límite superior en la cantidad de buffers pendientes (ya sea enviar o recibir) con su IO asíncrona".

¿Cómo se hace esto? ¿Se refiere esto al byte [] que se envía a BeginRead? Entonces, ¿la solución simplemente está envolviendo los bytes de acceso [] con un semáforo?

EDITAR: dos soluciones comunes son el acceso controlado por semáforo a los buffers de bytes o simplemente tener una agrupación de buffers de bytes de tamaño estático. Una preocupación que aún me queda es que cuando ocurra este problema de cliente asíncrono (tal vez en realidad sea un evento de red extraño) tener semáforos o grupos de bytes de búfer evitará que me quede sin memoria, pero no resuelve el problema. Mi grupo de buffers probablemente será devorado por el (los) cliente (s) problemático (s), en efecto, bloqueará la función correcta de los clientes legítimos.

EDIT 2: Encontré este granresponder. Básicamente se muestra cómo desasignar objetos manualmente. Y mientras que el código TCP asíncrono deja las reglas de tiempo de ejecución detrás de las escenas, podría ser posible anular eso al fijar de forma explícita cada búfer antes de usarlo, y luego deshacerlo al final del bloque o al final. Estoy tratando de resolver eso ahora ...

Respuestas a la pregunta(1)

Su respuesta a la pregunta