2013-05-14 40 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