多くの TCP リスナーにデータを送信するプログラムを作成しています。TCP 送信チャネルの 1 つが使用されなくなった場合、TCPClient.close を使用して閉じる必要がありますか。開いたままにしておくとどうなりますか?
ありがとう!
私はClose
明示的に使用しません - 私はusing
ステートメントを介してそれを処分します:
using (TcpClient client = ...)
{
// Use the client
}
開いたままにしておくとどうなりますか?
どちらの側も接続を閉じない場合は、無意味に何もせずにそこに座っていることになります。
相手側が接続を閉じた場合、しばらくの間 TIME_WAIT または同様のものでローカル接続が確立されると思います。正確な詳細はわかりませんが、理想的ではありません。
要点は、システム リソースを使い果たす可能性があることであり、基本的には理想的ではありません。プログラムがクラッシュしたり、システムがおかしくなったりすることはありませんか? おそらくそうではありません-少なくとも、これらの膨大な数を作成している場合を除きます。ただし、メモリ以外のリソースを持つものはすべて破棄することをお勧めします。
開いたままにしておくと、GC (ガベージ コレクター) がやがてオブジェクトを破棄します。
TCPClient では、ファイナライザー (GC がオブジェクトをクリーンアップするときに実行されるコード) が Dispose() を呼び出します。これにより、接続が閉じられ、使用されている OS リソースが解放されます。
GC がいつクリーンアップを行うかわからないため、このアプローチは非決定論的です。これは、1 つまたは 2 つの開いている接続ではおそらく問題にはなりませんが、これらの接続を大量に開くと、システムのリソースが枯渇する可能性があります。
TCPClient を使い終わったら、常に破棄することをお勧めします。これは、using
ブロックで簡単に実現できます。(Jon Skeetsの回答に示されているように...)