2012-06-07 18 views
5

Según el número de preguntas, publicaciones en el foro, etc., parece que la implementación TcpClient/NetworkStream en el BCL carece de soporte decente para cancelar operaciones IO. Con la adición de métodos Async en .NET 4.5, esta falta de cancelación (o soporte decente de tiempo de espera) hace que las cosas sean aún más frustrantes ya que se vuelve aún más complicado (casi imposible) cancelar una tarea que se niega a monitorear su Cancelación mientras realiza IO ..NET Implementación TcpClient/NetworkStream que admite operaciones asincrónicas y respeta los tiempos de espera

He visto muchas implementaciones que activan subprocesos adicionales para supervisar el funcionamiento de la red y cerrar la secuencia subyacente si parece que las cosas van mal. Esto se siente muy sucio en un mundo en el que intentamos conservar estos recursos mediante el uso de operaciones asincrónicas.

¿Alguien puede orientarme en la dirección de la orientación en cuanto a la forma eficiente de cancelar/temporizar las operaciones de IO de la red o hacia una implementación robusta de terceros que realmente funcione?

Respuesta

4

La cancelación de IO no es trivial. Comenzando con Vista, tenemos la capacidad de cancelar, pero eso es algo bastante nuevo y los controladores deben ser compatibles.

En términos prácticos, lo mejor que puede hacer es cerrar el zócalo para cancelar todo. De forma alternativa, puede implementar una función de envoltura alrededor de una tarea que proporcione una finalización instantánea cuando se establezca el CancelToken. La operación IO continuaría pero su resultado se descartaría.

He aquí una discusión a fondo sobre el tema: http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187

+0

pensé CancelIo/CancelIoEx fueron las funciones de nivel de sistema operativo, en lugar de depender de los conductores para implementar/apoyarlos? – Andrew

+0

Son API de Win32 que llaman a la kernes que llama al controlador. Si cancela una gran lectura, el conductor debe cooperar diciéndole al disco que se detenga. CancelIO tiene efectos físicos. – usr

+2

Gracias por empujarme en esta dirección. Pensé que CancelIo/CancelIoEx eran del nivel del sistema operativo y no requieren soporte a nivel de controlador. Después de investigar un poco más sobre esto, me encontré con esta publicación (no tengo idea cómo me la perdí antes) que discute los desafíos de cancelar async IO. Parece que IO basado en archivos está en línea para obtener una revisión, pero la red no lo está. http://social.msdn.microsoft.com/Forums/da-DK/async/thread/54632b19-0e9c-4078-aa59-c4389e75b187 – Andrew

Cuestiones relacionadas