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