3

多くの TCP リスナーにデータを送信するプログラムを作成しています。TCP 送信チャネルの 1 つが使用されなくなった場合、TCPClient.close を使用して閉じる必要がありますか。開いたままにしておくとどうなりますか?

ありがとう!

4

2 に答える 2

11

私はClose明示的に使用しません - 私はusingステートメントを介してそれを処分します:

using (TcpClient client = ...)
{
    // Use the client
}

開いたままにしておくとどうなりますか?

どちらの側も接続を閉じない場合は、無意味に何もせずにそこに座っていることになります。

相手側が接続を閉じた場合、しばらくの間 TIME_WAIT または同様のものでローカル接続が確立されると思います。正確な詳細はわかりませんが、理想的ではありません。

要点は、システム リソースを使い果たす可能性があることであり、基本的には理想的ではありません。プログラムがクラッシュしたり、システムがおかしくなったりすることはありませんか? おそらくそうではありません-少なくとも、これらの膨大な数を作成している場合を除きます。ただし、メモリ以外のリソースを持つものはすべて破棄することをお勧めします。

于 2012-07-28T11:58:09.693 に答える
3

開いたままにしておくと、GC (ガベージ コレクター) がやがてオブジェクトを破棄します。

TCPClient では、ファイナライザー (GC がオブジェクトをクリーンアップするときに実行されるコード) が Dispose() を呼び出します。これにより、接続が閉じられ、使用されている OS リソースが解放されます。

GC がいつクリーンアップを行うかわからないため、このアプローチは非決定論的です。これは、1 つまたは 2 つの開いている接続ではおそらく問題にはなりませんが、これらの接続を大量に開くと、システムのリソースが枯渇する可能性があります。

TCPClient を使い終わったら、常に破棄することをお勧めします。これは、usingブロックで簡単に実現できます。(Jon Skeetsの回答に示されているように...)

于 2012-07-28T12:03:13.257 に答える