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.

请注意,它谈到了非托管资源。这些只会通过UdpClient运行一些代码来释放 - 它要么在Close/Dispose中执行,要么必须在其Finalize方法中执行 - 没有其他任何东西会导致它们被释放(假设程序保持运行)。

可以Close通过使用让它在另一个线程上运行来隐藏操作的成本Task.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

Instead of Using Send could you use BeginSend and then in your callback handle an exception when you attempt to Close if that is actually the problem?

于 2012-10-08T06:54:50.113 回答
0

You're targeting joe-pc presumably with different ip addresses as the dns record changes, but you reuse the same UdpClient for each send. Just remember to Close() it when you're all done.

Use

//
// 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);

and skip the dns lookup too.

于 2012-10-11T14:25:39.950 回答
0

I know this is a while but I stumbled today upon this question and wanted to add:

udp=null;

is not pointless imho. You can see in some cases in a memory profiler that your instance is still available if you dont set it to null.

于 2017-01-26T13:49:10.673 回答