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?
pensé CancelIo/CancelIoEx fueron las funciones de nivel de sistema operativo, en lugar de depender de los conductores para implementar/apoyarlos? – Andrew
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
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