Отмена вызова Socket.xxxxAsync - PullRequest
       5

Отмена вызова Socket.xxxxAsync

12 голосов
/ 19 февраля 2009

После вызова Socket.Shutdown, Socket.Close и Socket.Disconnect оказывается, что Socket.ReceiveAsync не прерывается. Попытки повторно использовать объект SocketAsycEventArgs, использованный в вызове ReceiveAsync (рекомендуется в документации в качестве передового опыта), приводят к ошибке:

Асинхронная операция с сокетом уже выполняется с использованием этого экземпляра SocketAsyncEventArgs

Что мне нужно сделать, чтобы ReceiveAsync освободил захват этого экземпляра SocketAsyncEventArgs?

Редактировать: я работал над этим, отмечая ожидающее получение и не делая никакой очистки, пока не поступит получение (то есть отправлено Завершено). Хотя не слишком хорошо. Разве это не может быть просто прервано, как API WebRequest?

Ответы [ 2 ]

7 голосов
/ 19 февраля 2009

Похоже, нет способа прервать асинхронный прием.

Когда сокет закрыт, это принудительно завершает получение, а свойство SocketError параметра SocketAsyncEventArgs для вашего метода обратного вызова будет иметь значение SocketError.OperationAborted. Когда это условие встречается, вы можете вернуть объект SocketAsyncEventArgs в пул для повторного использования.

Это продемонстрировано в примере, показанном здесь . В частности, посмотрите на метод ProcessReceive (), который вызывает метод CloseClientSocket (), когда e.BytesTransferred == 0 или e.SocketError != SocketError.Success. В методе CloseClientSocket () объект SocketAsyncEventArgs возвращается в пул.

0 голосов
/ 17 октября 2010

Наиболее вероятная причина - повторное использование SocketAsyncEventArgs, который вы вызываете:

SAE.Completed + = новый EventHandler (SocketEventArg_Completed);

Это приведет к тому, что ваш обратный вызов будет вызван несколько раз !!!

Обязательно установите обработчик Completed только один раз.

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