Распределение ресурсов TcpClient - PullRequest
1 голос
/ 24 ноября 2011

Скажите, у меня есть Stream, произведенный через TcpClient.GetStream(). Если я stream.Dispose(), необходимо ли избавиться от TcpClient, который создал Stream?

Ответы [ 2 ]

3 голосов
/ 24 ноября 2011

Глядя на реализации TcpClient.GetStream и TcpClient.Dispose в ILSpy, я согласен, что у вас не должно быть утечки ресурсов, если вы вызываете Dispose() в потоке, но не на клиенте.

Однако я не уверен, что это хорошая идея.

Я бы спросил, почему вы не хотите звонить Dispose() в случае TcpClient. Контракт, подразумеваемый тем фактом, что TcpClient реализует IDisposable, заключается в том, что Dispose() следует вызывать, когда экземпляр больше не требуется.

Если вы нарушите этот контракт:

  • Это будет сбивать с толку будущих разработчиков вашего кода?
  • Что, если реализация TcpClient изменится в будущих версиях?
0 голосов
/ 24 ноября 2011

OK.Я выбрал Reflector, чтобы проверить это сам.Если вы вызываете GetStream для TcpClient, он инициализирует член m_DataStream ненулевым значением.

Тело метода dispose для TcpClient выглядит примерно так:

        IDisposable dataStream = this.m_DataStream;
        if (dataStream != null)
        {
            dataStream.Dispose();
        }
        else
        {
            //some other disposal strategy
        }

Поэтому, если я сам распоряжаюсь потоком, я выполняю то же удаление, что и TcpClient.

Так что, насколько я могу судить, если я распоряжаюсь потоком, ненужно удалять TcpClient.

Кто-нибудь не согласен?

...