2011-09-30 11 views
14

私はthe documentation on TcpClient.Close()を読み、これに気づいている:このメソッドは、最終的に関連したソケットの近くになりますし、また1を作成した場合は、データを送受信するために使用された関連NetworkStreamを閉じます呼び出しNetworkStreamとTcpClientの両方またはTcpClientだけを閉じる必要はありますか?

を。

だから、私が間違っているが、これは1がNetworkStreamも閉鎖されることTcpClientClose()を呼び出す場合と言うなら、私を修正します。

コード例の最後に、なぜClose()が呼び出されるのですか?

networkStream.Close(); 
tcpClient.Close(); 

tcpClient.Close();に電話するだけで問題はありませんか?

+1

はい、必要ありません。その例ではtcpClient.Close()を使用する必要はありません。その直後にプログラムが終了します。 –

+3

.NET 3.0より前では、TcpClientとその基礎となるNetworkStreamの両方を明示的にクローズする必要がありました。 .NET 3.0以降では、TcpClientを閉じるときに基底のNetworkStreamが閉じられます。 TcpClientのClose()とDispose()は同等で、Close()は内部ログをいくつか追加しています。 –

答えて

9

私は答えを受け入れることができるように他の誰もしなかったので、この質問に答えてください。

Hansによると、TcpClient.Close()が基になるNetworkStreamを閉じるため、NetworkStream.Close()を呼び出す必要はありません。

+2

この回答は間違っています。 Vivienの答えを見てください。ここに記載されているように、[docのGetStream](http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream.aspx)には、 'あなたが終わったときにNetworkStreamを閉じる必要がありますデータの送受信。 TcpClientを閉じるとNetworkStreamが解放されません。 ' – BitMask777

+4

ただし、[doc for Close](http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close.aspx)には、 'Callingこのメソッドは最終的に関連付けられたSocketを閉じる結果になり、作成されたデータを送受信するために使用される関連するNetworkStreamも閉じます。「GetStreamのドキュメントが古くなっていると思われます。 NET 2.0(それはまだ問題だったとき)。 – Sam

-6

あなただけ行う必要があります "TcpClient.Close()"
それとも、入力する必要がある場合

2

NetworkStreamれるtcpClientとの両方がIDisposableインターを実装しています。だから私の意見では、ベストプラクティスは使用ブロックにパックすることです。そのため、手動でクローズまたは処分する必要はありません。

1

クライアントを閉じることでストリームが閉じず、GetStreamメソッドのドキュメントにあります。 参照のため、この議論を見てください。How to properly and completely close/reset a TcpClient connection?

+0

[Samがここに書いているように](http://stackoverflow.com/questions/7617127/does-one-need-to-close-both-networkstream-and-tcpclient-or-just-tcpclient#comment26031079_7623611)、そのメモは時代遅れ。これまで必要だったのですが、.NET 3.0以降、もはやそれはありません。 – Stijn

関連する問題