Если возможно, вы должны использовать конструкцию C # using
, чтобы утилизировать поток «автоматически» после использования:
using (var sslStream = new SslStream(stream, false))
{
// read from stream here...
}
Однако, если вы хотите сохранить SslStream для дальнейшего использования, вам придется утилизировать его вручную.
Удаление потока, как правило, также закрывает поток, метод Close()
, кажется, используется в основном для полноты. Вы можете скачать исходный код .NET (или использовать декомпилятор) и проверить SslStream.cs
и его базовый класс AuthenticatedStream.cs
, чтобы увидеть точное поведение.
Чтобы ответить на остальную часть вашего вопроса - SslStream
хорошо документирован на сайте Microsoft MSDN , на котором показан один из конструкторов SslStream
принимает два параметра (также показано на вашем примере). Первый параметр - это внутренний поток, который в вашем примере является объектом NetworkStream
. Вторым является логическое значение, называемое leaveInnerStreamOpen
. В вашем примере вы передаете false
.
Именно это второе значение определяет поведение, о котором вы спрашиваете: если вы передадите true
, , внутренний поток останется открытым , когда вы закроете / опустите SslStream (поток также будет очищен ). Если вы передадите false
, то внутренний поток тоже будет закрыт .
Аналогично для NetworkStream
его конструктор также принимает логическое значение ownsSocket
. Если для этого параметра установлено значение true
(как в вашем примере), то утилизация / закрытие NetworkStream также закроет сокет , в противном случае он останется открытым.
Таким образом, в качестве примера кода вы должны вызывать sslStream.Dispose()
и stream.Dispose()
(сокет автоматически закрывается).
Однако, если вы измените второй параметр в конструкторе SslStream
на true
в вашем примере кода, вы можете просто вызвать sslStream.Dispose()
, чтобы закрыть SslStream
, NetworkStream
и его сокет .