Должен ли я хранить TcpClient, хотя я забочусь только о его потоке? - PullRequest
3 голосов
/ 08 марта 2010

Новый экземпляр TcpClient подключается к удаленному хосту. Его NetworkStream извлекается и сохраняется. Нужно ли хранить сам TcpClient, чтобы убедиться, что он не является сборщиком мусора?

В случае, если вы собираетесь ответить «Вы должны сохранить его, чтобы иметь возможность утилизировать его»: В моем конкретном случае TcpClient обычно живет долгое время (время жизни приложения), поэтому его удаление не является обязательным. Тем не менее, я согласен с тем, что в общем случае он должен храниться только для того, чтобы вызвать Dispose.

Ответы [ 2 ]

2 голосов
/ 08 марта 2010

NetworkStream не будет удален, если на него все еще ссылаются. Сборщик мусора очищает только те объекты, на которые больше нет ссылок - он ничего не знает об объектах, которые должен собирать, он просто отслеживает ссылки.

Однако вы можете обнаружить, что TcpClient имеет финализатор, который сделает недействительным поток, если TcpClient будет собран. Вероятно, безопаснее сохранить ссылку на TcpClient. (Насколько я вижу из исходного кода, финализатор не в настоящее время делает это, но нет гарантии, что в будущем этого не произойдет.)

1 голос
/ 08 марта 2010

Если на объект не ссылаются, он будет в конечном итоге собран мусором, что сделает ваш NetworkStream непригодным для использования. Вам нужно сохранять ссылку на этот объект TcpClient, пока вы хотите его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...