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つだけですか?いくつかのリソースを解放する必要はありますか?

4

2 に答える 2

2

それらをusingブロックに入れます。操作が完了した後、各ストリームを適切に閉じて破棄します。

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

}
于 2013-05-14T08:35:38.987 に答える
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
    } 
 }
于 2013-05-14T08:41:38.603 に答える