1

次のコード ブロックがあり、プログラムの効率に影響します。ここでの問題は、ターゲット ホストが存在する場合、すべて問題ないことです。ただし、存在する場合は、実行に時間がかかりすぎます。最後に、「udp.Close()」が実行時間の大半を占めていることがわかりました。close メソッドを呼び出さなければ、効率は良いです。

close メソッドを呼び出さない場合の欠点を教えてくれる人はいますか?? どうもありがとうございました。

{ // This is my code block, I need to execute it many many times.
string ipAddress = Dns.GetHostAddresses("joe-pc").FirstOrDefault().ToString();
UdpClient udp = new UdpClient(ipAddress, Port);
udp.Send(msg, msg.Length);
udp.Close();
udp = null;
}
4

5 に答える 5

3

欠点は、リソース リークが発生することです。幸運なことに、ガベージ コレクションが頻繁に発生するため、プログラムでガベージ コレクションが発生することはありません。のドキュメントからClose

Closeは、基になるリソースを無効にし、Socketに関連付けられているすべての管理対象および管理対象外のリソースを解放しますUdpClient

管理されていないリソースについて話していることに注意してください。これらは、いくつかのコードを実行することによってのみ解放されます - /でそれを行うか、そのメソッドでそれを行う必要があります - それ以外にそれらが解放されることはありません (プログラムが実行されていると仮定します)。UdpClientCloseDisposeFinalize

を使用して別のスレッドで実行することにより、操作のコストを隠すことができる場合がありますが、そのためのコストを比較検討する必要があります。CloseTask.Run


または、より具体的に言えば、このメソッドを何度も実行する必要があると言います。ここでリソースをクリーンアップしないと、必要なリソースを取得できないため、後続の呼び出しが完全に失敗する可能性が高くなります (それらはすべて既存の非ClosedUdpClientインスタンスに結び付けられています)。


そして、私のコメントに示されているように、次の行は無意味です。

udp = null;

このようなコードは、COM 時代の VB では使用されていましたが、.NET の世界ではその場所がありません。

于 2012-10-08T06:51:11.137 に答える
1

Close()、基になる Socket を無効にし、UdpClient に関連付けられているすべてのマネージド リソースとアンマネージド リソースを解放します。閉じていない場合、ポートやIPアドレスなどのリソースを無効にしたり割り当てを解除したりしません

于 2012-10-08T06:50:22.303 に答える
0

使用する代わりに、コールバックで例外を処理して、それが実際に問題である場合にクローズしようとしたときに例外を処理Sendできますか?BeginSend

于 2012-10-08T06:54:50.113 に答える
0

DNSレコードが変更されると、おそらく異なるIPアドレスでjoe-pcをターゲットにしていますが、送信ごとに同じUdpClientを再利用します。すべて完了したら、忘れずに Close() してください。

使用する

//
// Summary:
//     Sends a UDP datagram to a specified port on a specified remote host.
//
// Parameters:
//   dgram:
//     An array of type System.Byte that specifies the UDP datagram that you intend
//     to send represented as an array of bytes.
//
//   bytes:
//     The number of bytes in the datagram.
//
//   hostname:
//     The name of the remote host to which you intend to send the datagram.
//
//   port:
//     The remote port number with which you intend to communicate.
//
// Returns:
//     The number of bytes sent.
//
public int Send(byte[] dgram, int bytes, string hostname, int port);

DNSルックアップもスキップします。

于 2012-10-11T14:25:39.950 に答える