Требуется ли Socket.AcceptAsync и вызов метода 'End' - PullRequest
0 голосов
/ 30 августа 2011

Чтение документации MSDN для Socket.AcceptAsync. Я до сих пор не до конца понимаю, есть ли бесплатный метод End.

Итак, в случае BeginAccept () есть метод EndAccept (), который завершает вызов и принимает IAsyncResult в качестве параметра, предоставляя разработчику доступ к Socket (через метод IAsyncResult.AsyncState). Вызов EndAccept (или любой другой пары методов Endxxx) внутренне очищает некоторые выделенные ресурсы CLR, а также предоставляет функциональные возможности для отслеживания того, действительно ли асинхронная операция завершена / допущена ошибка и т. Д.

Все это приводит меня к вопросу о необходимости вызова метода End после вызова AcceptAsync - или ReceiveAsync в этом отношении? Или их методы End аккуратно заключены в Async, возможно, как Task и ContinueWith? Следовательно, почему SocketAsyncEventArgs содержит сам Socket.

Если кто-нибудь знает, то гениально! Большое спасибо!

1 Ответ

1 голос
/ 31 августа 2011

Нет. Нет метода End.

Вы должны обработать событие Completed в SocketAsyncEventArgs. Также обратите внимание, что ReceiveAsync и т. Д. Могут выполняться напрямую (и, следовательно, не вызывать событие).

Обновление

Следовательно, почему SocketAsyncEventArgs содержит сам Socket.

Это потому, что вы должны иметь возможность обрабатывать операции ввода-вывода для всех клиентов в одном классе. У вас также есть свойство UserToken, которое можно использовать для хранения специфичной для клиента информации.

Или их методы End аккуратно обернуты в Async, возможно, как Задача и ContinueWith

Нет. Новая модель Async больше похожа на «реальную» модель (порты завершения ввода-вывода), которые предоставляются Windows. Структура типа Begin / End была введена для облегчения асинхронного программирования. Модель XxxxAsync была создана для того, чтобы получить еще большую производительность для тех приложений, которые в ней нуждаются (хотя некоторые из них выиграют, но для них это действительно важно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...