Что касается C # и метода .NET System.Net.Sockets.Socket.AcceptAsync
, потребуется обработать возвращаемое значение «ложь», чтобы обработать немедленно доступное состояние SocketAsyncEventArgs
из синхронно обработанного соединения. , Microsoft предоставляет примеры (найденные на странице класса System.Net.Sockets.SocketAsyncEventArgs
), которые вызовут переполнение стека, если имеется большое количество ожидающих соединений, которые могут быть использованы в любой системе, реализующей их модель обработки.
Другие идеи для решения этой проблемы заключаются в создании цикла, который вызывает метод-обработчик, с условием, что возвращаемое значение Socket.AcceptAsync
равно false, и прерывании цикла (чтобы разрешить отложенную обработку), если значение указывает, что операция завершается асинхронно (true). Однако это решение также вызывает уязвимость переполнения стека из-за того факта, что обратный вызов, связанный с SocketAsyncEventArgs
, переданным Socket.AcceptAsync
, имеет в конце метода вызов Socket.AcceptAsync
, который также имеет цикл для немедленного доступные, синхронно принятые, соединения.
Как видите, это довольно серьезная проблема, и мне еще предстоит найти хорошее решение, которое не включает System.Threading.ThreadPool
и создание множества других методов и обработки планирования. Насколько я вижу, модель асинхронного сокета, относящаяся к Socket.AcceptAsync
, требует большего, чем продемонстрировано в примерах на MSDN.
Есть ли у кого-нибудь чистое и эффективное решение для обработки немедленно ожидающих соединений, которые синхронно принимаются от Socket.AcceptAsync, без создания отдельных потоков для обработки соединений и без использования рекурсии?