Я проводил много исследований о том, как лучше всего писать «правильный» сетевой код на C#.Сетевое программирование на C# и использование ресурсов
Я видел несколько примеров, используя инструкцию «using» для C#, и я думаю, что это хороший подход, однако я видел непоследовательное использование его с различными выражениями.
Например, предположим, что у меня есть некоторый код, как это:
TcpClient tcpClient = new TcpClient("url.com", 80);
NetworkStream tcpStream = tcpClient.GetStream();
StreamReader tcpReader = new StreamReader(tcpStream);
StreamWriter tcpWriter = new StreamWriter(tcpStream);
Очевидно, что этот код будет очень отслаиваться. Итак, я видел код, который использует использование на tcpClient, что кажется хорошим. Однако нет ли у NetworkStream ресурсов, требующих очистки? Что относительно StreamReader/Writer?
Нужно ли обертывать все 4 оператора в вложенных операциях using?
И если да, то что произойдет, когда придет время? Не будет ли StreamWriter закрывать поток и, следовательно, сокет? Тогда что происходит, когда StreamReader, затем NetworkStream, затем TcpClient каждый проходит через их выбытие?
Что вызывает другой вопрос. Как с StreamReader, так и с StreamWriter, состоящим из одного потока, которому принадлежит это? Разве они оба не считают, что они владеют им, и, таким образом, обе пытаются уничтожить его? Или фреймворк знает, что поток уже уничтожен и просто молча игнорирует его?
Похоже, что оператор using нужен только для последнего оператора в цепочке, но что происходит, если исключение выбрано в GetStream()? Я не думаю, что это правильно очистит розетку, поэтому, кажется, излишнее использование необходимо, чтобы этого не произошло.
Кто-нибудь знает какие-либо хорошие, последние книги по сетевому программированию с .net и prefeably C#, которые включают главы по обработке исключений и управлению ресурсами? Или, может быть, хорошие статьи в Интернете? Все книги, которые я могу найти, относятся к эпохе .NET 1.1 (Сетевое программирование для Microsoft .NET Framework, Сетевое программирование в .NET и т. Д.), Поэтому это похоже на тему, требующую хороших ресурсов.
EDIT:
Пожалуйста, не позволяйте очень хороший комментарий Marc не остановит кого-либо еще комментировать это :)
Я хотел бы услышать рекомендации никому вернулись на Родину книги или мнения по управлению ресурсами, особенно в отношении асинхронного использования.
Спасибо за обратную связь. Это во многом то, что я подозревал. Согласен, NetworkStream - это странность. Я не уверен, было бы менее проблематично создавать отдельные потоки чтения и записи, но это то, что есть. Спасибо за рекомендацию книги. –
Кроме того, я не видел реализацию NonClosingStream на указанном вами сайте. –
Он есть - MiscUtil.IO.NonClosingStreamWrapper –