Como impedir que o código tcp .NET assíncrono use todos os recursos de um sistema

Em alguns códigos de servidor tcp assíncronos, ocasionalmente ocorre um erro que faz com que o processo consuma toda a memória do sistema. Ao observar os logs, o visualizador de eventos e algunsMS docs o problema acontece se "o aplicativo de chamada fizer chamadas assíncronas de E / S para o mesmo cliente várias vezes, então você poderá ver uma fragmentação de heap e aumento de byte privado se o cliente remoto parar seu fim de E / S", o que resulta em picos no uso de memória e pinagem de System.Threading.OverlappedData struct e byte arrays.

A solução proposta do artigo da KB é "definir um limite superior sobre a quantidade de buffers pendentes (enviar ou receber) com seu IO assíncrono".

Como se faz isso? Isso está se referindo ao byte [] que é enviado para o BeginRead? Então a solução é simplesmente agrupar o byte [] com um semáforo?

EDIT: Semaphore controlado o acesso a buffers de byte ou apenas ter pool de tamanho estático de buffers de byte são duas soluções comuns. Uma preocupação que ainda resta é que quando esse problema de cliente assíncrono ocorre (talvez seja algum evento de rede estranho na verdade) ter semáforos ou buffer pools de byte me impedirá de ficar sem memória, mas isso não resolve o problema. Meu pool de buffers provavelmente será engolido pelo (s) cliente (s) problemático (s), com efeito bloqueando a função correta dos clientes legítimos.

EDIT 2: Veio através desta granderesponda. Basicamente, mostra como remover manualmente os objetos. E, embora o código TCP assíncrono permaneça restrito às regras de tempo de execução de bastidores, pode ser possível substituir isso fixando explicitamente cada buffer antes de usá-lo, depois desmarcando no final do bloco ou no final. Eu estou tentando descobrir isso agora ...

questionAnswers(1)

yourAnswerToTheQuestion