Я провел много исследований о том, как лучше написать "правильный" сетевой код на 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 оператора во вложенные операторы?
И если так, что происходит, когда пришло время распоряжаться? Не закроет ли StreamWriter поток и, следовательно, сокет? Что происходит, когда StreamReader, затем NetworkStream, затем TcpClient каждый проходит свою утилизацию?
Что поднимает другой вопрос. Имеет ли StreamReader и StreamWriter один и тот же поток, кому он принадлежит? Разве они оба не думают, что владеют им, и, таким образом, оба попытаются уничтожить его? Или фреймворк знает, что поток уже уничтожен, и просто молча игнорирует его?
Кажется, что оператор using необходим только для последнего оператора в цепочке, но что произойдет, если в GetStream () будет сгенерировано исключение? Я не думаю, что тогда он будет должным образом очищать сокет, так что кажется, что избыточное использование необходимо, чтобы этого не произошло.
Кто-нибудь знает о каких-нибудь хороших, недавних книгах по сетевому программированию с использованием .net и предпочтительно c #, которые включают главы по обработке исключений и управлению ресурсами? Или, может быть, какие-нибудь хорошие статьи онлайн? Все книги, которые я могу найти, относятся к эпохе .NET 1.1 (Сетевое программирование для Microsoft .NET Framework, Сетевое программирование на .NET и т. Д.), Поэтому эта тема, похоже, требует хороших ресурсов.
EDIT:
Пожалуйста, не позволяйте очень хорошим комментариям Марка помешать кому-либо еще комментировать это:)
Я хотел бы услышать, как кто-нибудь еще издает рекомендации или мнения по управлению ресурсами, особенно в отношении асинхронного использования.