如果可能,您应该使用 C# 的using
构造在使用后“自动”处理流:
using (var sslStream = new SslStream(stream, false))
{
// read from stream here...
}
但是,如果您想保留 SslStream 以供以后使用,则必须手动处理。
处理流通常也会关闭流,该Close()
方法似乎主要是为了完整性。您可以下载 .NET 源代码(或使用反编译器),并检查 .NETSslStream.cs
及其基类AuthenticatedStream.cs
以查看确切的行为。
要回答您的其余问题 - SslStream
Microsoft 的MSDN站点上有详细记录,其中显示的构造函数之一SslStream
采用两个参数(您的示例也显示了)。第一个参数是内部流 - 在您的示例中是NetworkStream
对象。第二个是一个布尔值,称为leaveInnerStreamOpen
. 在您的示例中,您通过false
.
正是这第二个值决定了您要询问的行为:如果您通过true
,当您关闭/处理 SslStream 时,内部流将保持打开状态(该流也将被刷新)。如果你通过了false
,那么内流也会被关闭。
类似地NetworkStream
,它的构造函数也接受一个布尔值ownsSocket
。如果将其设置为true
(如您的示例中所示),则处置/关闭 NetworkStream也将关闭其 socket,否则它将保持打开状态。
因此,正如您的示例代码所代表的那样,您必须同时调用sslStream.Dispose()
and stream.Dispose()
(套接字自动关闭)。
但是,如果您将SslStream
' 的构造函数中的第二个参数更改为true
示例代码中的第二个参数,则只需调用sslStream.Dispose()
以关闭SslStream
、NetworkStream
及其套接字。