Jak zatrzymać asynchroniczny kod tcp .NET do wykorzystania zasobów całego systemu

W jakimś asynchronicznym kodzie serwera tcp mam czasami błąd, który powoduje, że proces pochłania całą pamięć systemu. Patrząc na dzienniki, przeglądarkę zdarzeń i inneDoktorzy MS problem występuje, jeśli „wywołująca aplikacja wielokrotnie wywołuje asynchroniczne wywołania IO do tego samego klienta, wtedy może pojawić się fragmentacja sterty i prywatny bajt, jeśli zdalny klient zatrzyma koniec operacji we / wy”, co powoduje wzrost użycia pamięci i przypinanie of System.Threading.OverlappedData struct i tablice bajtów.

Proponowane rozwiązanie w artykule KB polega na „ustawieniu górnej granicy ilości zaległych buforów (wysyłanych lub odbieranych) za pomocą asynchronicznego IO”.

Jak to zrobić? Czy to odnosi się do bajtu [], który jest wysyłany do BeginRead? Czy więc rozwiązanie po prostu zawija bajt dostępu [] za pomocą semafora?

EDYCJA: Dostęp sterowany semaforem do buforów bajtowych lub po prostu puli wielkości buforów bajtowych to dwa popularne rozwiązania. Problem, który wciąż mnie dotyczy, polega na tym, że gdy pojawia się ten problem z klientem asynchronicznym (być może jest to jakieś dziwne zdarzenie sieciowe) posiadanie semaforów lub puli buforów bajtowych uniemożliwi mi wyczerpanie pamięci, ale nie rozwiązuje problemu. Moja pula buforów prawdopodobnie zostanie pochłonięta przez problemowego klienta (klientów), w efekcie blokując poprawne funkcje uzasadnionych klientów.

EDYTUJ 2: Wpadł na to świetneodpowiedź. Zasadniczo pokazuje, jak ręcznie odpinać obiekty. I podczas gdy asynchroniczny kod TCP pozostawia przypinanie do reguł wykonywania w tle, możliwe jest zastąpienie tego przez jawne przypięcie każdego bufora przed użyciem, a następnie odpięcie na końcu bloku lub na końcu. Próbuję to teraz zrozumieć ...

questionAnswers(1)

yourAnswerToTheQuestion