2013-05-14 74 views
3

我具有被連接到一些網絡服務器(TCP)和使用網絡流連接的應用程序:如何正確關閉網絡流連接?

if (!SSL) 
{ 
    _networkStream = new System.Net.Sockets.TcpClient(Server, Port).GetStream(); 
    _StreamWriter = new System.IO.StreamWriter(_networkStream); 
    _StreamReader = new System.IO.StreamReader(_networkStream, Encoding.UTF8); 
} 

if (SSL) 
{ 
    System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient(Server, Port); 
    _networkSsl = new System.Net.Security.SslStream(client.GetStream(), false, 
        new System.Net.Security.RemoteCertificateValidationCallback(Protocol.ValidateServerCertificate), null); 
    _networkSsl.AuthenticateAsClient(Server); 
    _StreamWriter = new System.IO.StreamWriter(_networkSsl); 
    _StreamReader = new System.IO.StreamReader(_networkSsl, Encoding.UTF8); 
} 

///// since now I working with both reader and writer globally in multiple threads 

我使用讀取器和寫入異步地(在2個線程)和我需要有兩個這些流是全球可用的(它們被定義爲類級別的公共參考),所以我不知道這裏是否可以使用using聲明。

我該如何正確關閉此連接?所有對象(NetworkStream,流寫入器和讀取器)都有Close()方法。我應該爲所有人打電話嗎?或者只有1個?有沒有必要釋放一些資源?

回答

2

將它們放在using區塊中。在操作完成後,它將關閉並適當處理每個流。

using (StreamReader reader = new StreamReader(_networkStream, Encoding.UTF8)) 
{ 

} 
+0

這會結束這段代碼之後的連接,還是隻會釋放讀者? – Petr 2013-05-14 08:37:29

+0

@Petr - 您可以將它們嵌套在一起,連接將僅在讀取器和寫入器處理完畢且網絡流沒有要讀取的數據後纔會關閉。 – 2013-05-14 08:39:22

+0

你說「只有當網絡流沒有要讀取的數據時」,但如果服務器正在向網絡流發送一些數據(它有數據要讀取),但我想強制關閉連接呢? – Petr 2013-05-14 08:40:41

0

使用using(){}塊。通過這種方式,所有連接/流在使用後都會正確關閉。

using(_networkStream = new System.Net.Sockets.TcpClient(Server, Port).GetStream()) 
{ 
    using(_StreamWriter = new System.IO.StreamWriter(_networkStream)) 
    { 
     //do stuff 
    } 
    using(_StreamReader = new System.IO.StreamReader(_networkStream, Encoding.UTF8)) 
    { 
     //do stuff 
    } 
} 
+0

如果我想要異步讀寫這個流,該怎麼辦?我應該將讀者嵌入作家嗎? (讀者與寫作者不同的線程運行) – Petr 2013-05-14 08:42:47