2009-02-19 7 views
10

Después de llamar a Socket.Shutdown, Socket.Close y Socket.Disconnect, parece que Socket.ReceiveAsync no se cancela. Los intentos de reutilizar el objeto SocketAsycEventArgs utilizada en la llamada ReceiveAsync (se sugiere en la documentación como la mejor práctica) dan como resultado el error:Cancelar una llamada a Socket.xxxxAsync

An asynchronous socket operation is already in progress using this SocketAsyncEventArgs instance

¿Qué tengo que hacer para conseguir ReceiveAsync libere su agarre en este caso SocketAsyncEventArgs?

Editar: He solucionado esto al marcar una recepción pendiente y no hacer ninguna limpieza hasta que se recibe la recepción (es decir, se envía Completed). No se siente muy bien sin embargo. ¿No puede ser abortado, como la API de WebRequest?

Respuesta

6

No parece haber una forma de abortar la recepción asincrónica.

Cuando se cierra el conector, esto obliga al recibir a completar, y la propiedad SocketError del parámetro SocketAsyncEventArgs a su método de devolución de llamada tendrá un valor de SocketError.OperationAborted. Cuando se encuentra esta condición, puede devolver el objeto SocketAsyncEventArgs al grupo reutilizable.

Esto se demuestra en el ejemplo mostrado here. Específicamente, observe el método ProcessReceive(), que llama al método CloseClientSocket() cuando e.BytesTransferred == 0 o e.SocketError != SocketError.Success. El método CloseClientSocket() es donde el objeto SocketAsyncEventArgs se devuelve al grupo.

0

La causa más probable es que la reutilización de SocketAsyncEventArgs que está llamando:

SAE.Completed + = new manejador de sucesos (SocketEventArg_Completed);

Si lo hace, su devolución de llamada se llamará varias veces!

Asegúrese de establecer solo el controlador completo una vez.

+0

Esto no intenta responder a la pregunta planteada. El problema del OP proviene de intentar reutilizar 'SocketAsyncEventArgs' antes de que se dispare el controlador' Completed'. – binki

Cuestiones relacionadas