2012-03-29 10 views
0

I NetworkStream mit Steckdosen in einem SslStream Socket-Server verwenden, wie folgt:Hat SslStream.Dispose seinen inneren Strom entsorgen

stream = new NetworkStream(socket, true); 
sslStream = new SslStream(stream, false); 

Meine Frage ist, wenn, wenn ich sslStream.Dispose() nenne, wird der SslStream dispose/seinen inneren Strom schließen und seine Steckdose auch?

Oder muss ich explizit alle drei Ressourcen mit sslStream.Close(), stream.Close() und socket.Close() schließen?

Antwort

4

Wenn möglich, sollten Sie C# 's using Konstrukt, das den Strom zu verfügen ‚verwenden, um automatisch‘ nach dem Gebrauch:

using (var sslStream = new SslStream(stream, false)) 
{ 
    // read from stream here... 
} 

Wenn Sie jedoch die SslStream für eine spätere Verwendung halten wollen, müssen Sie manuell entsorgen müssen.

Das Disponieren eines Streams schließt normalerweise auch den Stream, die Close() Methode scheint hauptsächlich der Vollständigkeit halber zu sein. Sie können den .NET-Quellcode herunterladen (oder einen Decompiler verwenden) und das SslStream.cs und seine Basisklasse AuthenticatedStream.cs untersuchen, um das genaue Verhalten zu sehen.

Um den Rest Ihrer Frage zu beantworten - Die SslStream ist gut auf Microsofts MSDN Website, die one of SslStream's constructors zeigt zeigt zwei Parameter (auch durch Ihr Beispiel gezeigt) dokumentiert. Der erste Parameter ist der innere Strom - in Ihrem Beispiel das Objekt NetworkStream. Der zweite ist ein boolescher Wert leaveInnerStreamOpen. In Ihrem Beispiel übergeben Sie false.

Es ist dieser zweite Wert, der das Verhalten bestimmt, Sie fragen: Wenn Sie true passieren, der innere Strom bleibt offen, wenn Sie in der Nähe/die SslStream dipose (der Strom auch gespült werden wird). Wenn Sie false übergeben, wird der innere Strom auch geschlossen.

Ähnlich für die NetworkStream, nimmt sein Konstruktor auch eine boolesche ownsSocket. Wenn dies auf true (wie in Ihrem Beispiel) eingestellt ist, schließt/schließt der NetworkStream auch seinen Socket, ansonsten bleibt er offen.

daher als Beispielcode steht, müssen Sie sowohl sslStream.Dispose() nennen undstream.Dispose() (die Buchse automatisch geschlossen).

Wenn Sie jedoch den zweiten Parameter in den SslStream ‚s Konstruktor true in Ihrem Beispiel-Code zu ändern, können Sie einfach sslStream.Dispose() nennen die SslStream, die NetworkStream und seine Fassung zu schließen.

+0

ssl Konstruktor wahr bedeutet verlassen inneren Strom offen, dass bedeutet, obwohl sslstream geschlossen ist, inneren Strom bleibt offen.Ich denke, sslstream Konstruktor sollte falsch, um inneren Strom zu schließen. Danke – dabididabidi