9

Socket オブジェクトと NetworkStream オブジェクトを使用するクラスを破棄する最善の方法を誰かが知っているかどうか疑問に思っていましたか? 問題のクラスには、NetworkStream のインスタンスと、NetworkStream の作成に使用される Socket のインスタンスがあります。

this.socket = new Socket(
                           AddressFamily.InterNetwork,
                           SocketType.Stream,
                           ProtocolType.Tcp)
                        {
                            ReceiveBufferSize = 65536,
                            SendBufferSize = 150
                        };

this.socket.Connect(
                        new IPEndPoint(                                                                   
                              IPAddress.Parse(
                                          Properties.Settings.Default.MpsServer2),
                                          Properties.Settings.Default.MpsPort2));

this.stream = new NetworkStream(
                         this.socket, true);

私の Dispose メソッドでは、これを行う必要がありますか?

this.stream.Close();
this.socket.Shutdown(SocketShutdown.Both);
this.socket.Close();

これはすべて必要ですか、それともやり過ぎですか?

4

3 に答える 3

2

Socket関連するを破棄しませんNetworkStream。確かにリフレクターを発射しました。(.NETdllと.NETライブラリを分析するためのツール。すばらしいツール。無料版を完全にダウンロードする前に、月末にダウンロードする必要があります。商用)。

ただし、MDSNのドキュメントとリフレクターの両方によると、ストリームはソケットを閉じますが、ソケットの所有権がある場合に限ります。これを、オーバーロードされたコンストラクターの2番目のパラメーターとして設定できます。

データをフラッシュするShutdown場合は、いずれの場合も呼び出す必要があります。そうしないと、データが失われる可能性があります。

于 2011-02-18T23:06:59.417 に答える
1

SocketStreamImplementの両方を使用して、各オブジェクトIDisposableを呼び出すことができます。.Dispose()Disposeメソッドは、破棄に必要なクローズおよびその他のアクションを処理する必要があります。

this.stream.Dispose(); 
this.socket.Dispose(); 

たとえば、これはDisposeストリームクラスから分解されたメソッドです。

public void Dispose()
{
    this.Close();
}
于 2011-02-18T22:46:49.127 に答える
1

MSDN のドキュメントによると、stream.Close() を呼び出すと、「現在のストリームが閉じられ、現在のストリームに関連付けられているすべてのリソース (ソケットやファイル ハンドルなど) が解放されます。」と、stream.Close() によって、ソケット。ただし、まだ socket.Shutdown() を呼び出す必要があります。

とにかく、最も安全な方法は「使用」を使用することです。これにより、安全なサイトにアクセスできます:)

using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                        {
                            ReceiveBufferSize = 65536,
                            SendBufferSize = 150
                        };) {
  socket.Connect(
    new IPEndPoint(
      IPAddress.Parse(
        Properties.Settings.Default.MpsServer2), Properties.Settings.Default.MpsPort2));

  using (var stream = new NetworkStream(socket, true) {
    // do something with the stream here
  }

  socket.Shutdown(SocketShutdown.Both);
}
于 2011-02-18T22:55:44.243 に答える