Ho fatto molte ricerche sul modo migliore di scrivere codice di rete "corretto" in C#.Programmazione della rete C# e utilizzo delle risorse
Ho visto un certo numero di esempi usando l'istruzione "using" di C#, e penso che questo sia un buon approccio, tuttavia ho visto l'uso incoerente di esso con varie espressioni.
Per esempio, supponiamo di avere un po 'di codice come questo:
TcpClient tcpClient = new TcpClient("url.com", 80);
NetworkStream tcpStream = tcpClient.GetStream();
StreamReader tcpReader = new StreamReader(tcpStream);
StreamWriter tcpWriter = new StreamWriter(tcpStream);
Ovviamente, questo codice sta per essere molto traballante. Quindi, ho visto del codice che mette l'uso sul tcpClient, che sembra buono. Tuttavia, NetworkStream non dispone anche di risorse che devono essere pulite? Che mi dici di StreamReader/Writer?
Devo eseguire il wrap di tutte e 4 le istruzioni in istruzioni nidificate?
E se sì, cosa succede quando è giunto il momento di disporre? StreamWriter non chiuderà il flusso e di conseguenza il socket? Allora cosa succede quando StreamReader, poi NetworkStream, poi TcpClient passano attraverso le loro cessioni?
Che fa sorgere un'altra domanda. Con StreamReader e StreamWriter composti dallo stesso flusso, chi lo possiede? Non pensano entrambi di possederlo, e quindi tenteranno entrambi di distruggerlo? O il framework sa che il flusso è già stato distrutto e silenziosamente lo ignora?
Sembra quasi che l'istruzione using sia necessaria solo per l'ultima istruzione nella catena, ma cosa succede se viene generata un'eccezione in GetStream()? Quindi non penso che pulire correttamente il socket, quindi sembra che gli usi ridondanti siano necessari per garantire che ciò non avvenga.
Qualcuno sa di buoni libri recenti sulla programmazione di rete con .net e C#, che include in modo prefissato i capitoli sulla gestione delle eccezioni e la gestione delle risorse? O forse qualche buon articolo online? Tutti i libri che riesco a trovare provengono dall'era .NET 1.1 (Programmazione di rete per Microsoft .NET Framework, Network Programming in.NET, ecc.), Quindi questo sembra un argomento che richiede delle buone risorse.
EDIT:
Per favore, non lasciate che molto buon commento di Marc fermare chiunque altro dal commentare questo :)
Mi piacerebbe sentire qualcuno elses suggerimenti su libri o opinioni sulla gestione delle risorse, in particolare per quanto riguarda l'uso asincrono.
Grazie per il feedback. Questo è in gran parte ciò che sospettavo. Sono d'accordo, NetworkStream è una stranezza. Non sono sicuro che sarebbe stato meno problematico creare flussi di lettura e scrittura separati, ma è quello che è. Grazie per la raccomandazione del libro. –
Inoltre, non ho visto un'implementazione NonClosingStream nel sito che hai menzionato. –
È lì - MiscUtil.IO.NonClosingStreamWrapper –