He estado investigando mucho sobre la mejor manera de escribir el código de red "correcto" en C#.C# programación de red y uso de recursos
He visto una serie de ejemplos usando la instrucción "using" de C#, y creo que este es un buen enfoque, sin embargo he visto un uso inconsistente de él con varias expresiones.
Por ejemplo, supongamos que tengo un poco de código como este:
TcpClient tcpClient = new TcpClient("url.com", 80);
NetworkStream tcpStream = tcpClient.GetStream();
StreamReader tcpReader = new StreamReader(tcpStream);
StreamWriter tcpWriter = new StreamWriter(tcpStream);
Obviamente, este código va a ser muy escamosa. Entonces, he visto un código que pone el uso en el tcpClient, lo cual parece bueno. Sin embargo, ¿NetworkStream tampoco tiene recursos que necesiten limpiarse? ¿Qué pasa con StreamReader/Writer?
¿Debo completar las 4 instrucciones en declaraciones anidadas usando?
Y en caso afirmativo, ¿qué sucede cuando ha llegado el momento de desechar? ¿StreamWriter no cerrará la transmisión y, en consecuencia, el socket? Entonces, ¿qué sucede cuando StreamReader, luego NetworkStream, luego TcpClient cada uno pasa por sus disposiciones?
Lo que plantea otra pregunta. Con StreamReader y StreamWriter compuestos de la misma secuencia, ¿a quién pertenece? ¿No creen los dos que son los dueños y, por lo tanto, tratarán de destruirlo? ¿O el marco sabe que la secuencia ya ha sido destruida y simplemente la ignora silenciosamente?
Parece que la instrucción using solo es necesaria para la última instrucción de la cadena, pero ¿qué ocurre si se lanza una excepción en GetStream()? No creo que limpiaría adecuadamente el socket entonces, por lo que parece redundante, los usos son necesarios para garantizar que esto no suceda.
¿Alguien sabe de algunos buenos libros recientes sobre programación de redes con .net y, preferiblemente, C# que incluyen capítulos sobre manejo de excepciones y gestión de recursos? O tal vez algunos buenos artículos en línea? Todos los libros que puedo encontrar pertenecen a la era .NET 1.1 (Programación de redes para Microsoft .NET Framework, Programación de redes en .NET, etc.), por lo que parece un tema que necesita algunos buenos recursos.
EDIT:
Por favor, no deje muy buen comentario de Marc detener cualquier otra persona de hacer comentarios sobre esto :)
me gustaría oír a nadie vigilara recomendaciones de libros u opiniones sobre la gestión de recursos, especialmente con respecto al uso asincrónico.
Gracias por los comentarios. Esto es en gran medida lo que sospechaba. Estoy de acuerdo, NetworkStream es una rareza. No estoy seguro de si hubiera sido menos problemático crear secuencias de lectura y escritura separadas, pero es lo que es. Gracias por la recomendación del libro. –
Además, no vi una implementación NonClosingStream en el sitio que mencionaste. –
Está allí - MiscUtil.IO.NonClosingStreamWrapper –